key pattern 查询相应的key
- redis 允许模糊查询 key 有 3 个通配符
*、?、[]
- randomkey:返回随机 key
- type key:返回 key 存储的类型
- exists key:判断某个 key 是否存在
- del key:删除 key
- rename key newkey:改名
- renamenx key newkey:如果 newkey 不存在则修改成功
- move key 1:将 key 移动到 1 数据库
- ttl key:查询 key 的生命周期(秒)
- expire key 整数值:设置 key 的生命周期以秒为单位
- pexpire key 整数值:设置 key 的生命周期以毫秒为单位
- pttl key:查询 key 的生命周期(毫秒)
- perisist key:把指定 key 设置为永久有效
字符串类型的操作
set key value [ex 秒数] [px 毫秒数] [nx/xx]
- ```
如果ex和px同时写,则以后面的有效期为准
nx:如果key不存在则建立
xx:如果key存在则修改其值1
2
3
4
5
6- get key:取值
- mset key1 value1 key2 value2:一次设置多个值
- mget key1 key2:一次获取多个值
- setrange key offset value:把字符串的 offset 偏移字节改成 value,
- ```
如果偏移量 > 字符串长度,该字符自动补 0x00
- ```
- append key value:把 value 追加到 key 的原值上
- getrange key start stop:获取字符串中
[start, stop]
范围的值- ```
对于字符串的下标,左数从 0 开始,右数从 -1 开始
注意:当 start>length,则返回空字符串当 stop>=length,则截取至字符串尾 如果 start 所处位置在 stop 右边,则返回空字符串
1
2
3
4
5
6
7
8
9- getset key nrevalue:获取并返回旧值,在设置新值
- incr key:自增,返回新值,如果 incr 一个不是 int 的 value 则返回错误,incr 一个不存在的 key,则设置 key 为 1
- incrby key 2:跳 2 自增
- incrbyfloat by 0.7:自增浮点数
- setbit key offset value:设置 offset 对应二进制上的值,返回该位上的旧值
- ```
注意:如果offset过大,则会在中间填充0
offset最大到多少
2^32-1,即可推出最大的字符串为512M
- ```
bitop operation destkey key1 [key2..]
:对 key1 key2 做 opecation 并将结果保存在 destkey 上,opecation 可以是 AND OR NOT XOR- strlen key:取指定 key 的 value 值的长度
- setex key time value:设置 key 对应的值 value,并设置有效期为 time 秒
链表操作
Redis 的 list 类型其实就是一个每个子元素都是 string 类型的双向链表,链表的最大长度是 $2^32$。list 既可以用做栈,也可以用做队列。
list 的 pop 操作还有阻塞版本,主要是为了避免轮询
lpush key value:把值插入到链表头部
rpush key value:把值插入到链表尾部
lpop key:返回并删除链表头部元素
rpop key:返回并删除链表尾部元素
lrange key start stop:返回链表中
[start, stop]
中的元素lrem key count value:从链表中删除 value 值,删除 count 的绝对值个 value 后结束
- ```
count > 0 从表头删除
count < 0 从表尾删除
count=0 全部删除1
2
3
4
5
6
7
8
9
10
11- ltrim key start stop:剪切 key 对应的链接,切 `[start, stop]` 一段并把改制重新赋给 key
- lindex key index:返回 index 索引上的值
- llen key:计算链表的元素个数
- linsert key after|before search value:在 key 链表中寻找 search,并在 search 值之前|之后插入 value
- rpoplpush source dest:把 source 的末尾拿出,放到 dest 头部,并返回单元值
- ```
应用场景: task + bak 双链表完成安全队列
业务逻辑: rpoplpush task bak
接收返回值并做业务处理
如果成功则rpop bak清除任务,如果不成功,下次从bak表取任务
- ```
brpop,blpop key timeout:等待弹出 key 的尾/头元素
timeout为等待超时时间,如果timeout为0则一直等待下去 应用场景:长轮询ajax,在线聊天时能用到
hash_max_zipmap_entries 64 #配置字段最多 64 个 hash_max_zipmap_value 512 #配置 value 最大为 512 字节1
2
3
4
5
## hashes 类型及操作
Redis hash 是一个 string 类型的 field 和 value 的映射表,它的添加、删除操作都是 $O(1)$(平均)。hash 特别适用于存储对象,将一个对象存储在 hash 类型中会占用更少的内存,并且可以方便的存取整个对象。
配置:注意:如果不小心运行了 flushall,立即 shutdown nosave,关闭服务器,然后手工编辑 aof 文件,去掉文件中的 flushall 相关行,然后开启服务器,就可以倒回原来是数据。如果 flushall 之后,系统恰好 bgwriteaof 了,那么 aof 就清空了,数据丢失。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
- hset myhash field value:设置 myhash 的 field 为 value
- hsetnx myhash field value:不存在的情况下设置 myhash 的 field 为 value
- hmset myhash field1 value1 field2 value2:同时设置多个 field
- hget myhash field:获取指定的 hash field
- hmget myhash field1 field2:一次获取多个 field
- hincrby myhash field 5:指定的 hash field 加上给定的值
- hexists myhash field:测试指定的 field 是否存在
- hlen myhash:返回 hash 的 field 数量
- hdel myhash field:删除指定的 field
- hkeys myhash:返回 hash 所有的 field
- hvals myhash:返回 hash 所有的 value
- hgetall myhash:获取某个 hash 中全部的 field 及 value
## 集合(sets)
特点:无序性、确定性、唯一性
- sadd key value1 value2:往集合里面添加元素
- smembers key:获取集合所有的元素
- srem key value:删除集合某个元素
- spop key:返回并删除集合中 1 个随机元素(可以坐抽奖,不会重复抽到某人)
- srandmember key:随机取一个元素
- sismember key value:判断集合是否有某个值
- scard key:返回集合元素的个数
- smove source dest value:把 source 的 value 移动到 dest 集合中
- sinter key1 key2 key3:求 key1 key2 key3 的交集
- sunion key1 key2:求 key1 key2 的并集
- sdiff key1 key2:求 key1 key2 的差集
- sinterstore res key1 key2:求 key1 key2 的交集并存在 res 里
## 有序集合
概念:它是在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset 会自动按新的值调整顺序。可以理解为有两列的 MySQL 表,一列存储 value,一列存储顺序,操作中 key 理解为 zset 的名字。
和 set 一样 sorted sets 也是 string 类型元素的集合,不同的是每个元素都会关联一个 double 型的 score。sorted set 的实现是 skip list 和 hash table 的混合体。
当元素被添加到集合中时,一个元素到 score 的映射被添加到 hash table 中,所以给定一个元素获取 score 的开销是 $O(1)$。另一个 score 到元素的映射被添加的 skip list,并按照 score 排序,所以就可以有序地获取集合中的元素。添加、删除操作开销都是 $O(logN)$ 和 skip list 的开销一致,redis 的 skip list 实现是双向链表,这样就可以逆序从尾部去元素。sorted set 最经常使用方式应该就是作为索引来使用,我们可以把要排序的字段作为 score 存储,对象的 ID 当元素存储。
- zadd key score1 value1:添加元素
- `zrange key start stop [withscore]`:把集合排序后,返回名次 `[start,stop]` 的元素(默认是升续排列 withscores 是把 score 也打印出来)
- zrank key member:查询 member 的排名(升序 0 名开始)
- `zrangebyscore key min max [withscores] limit offset N`:集合(升序)排序后取 score 在 `[min, max]` 内的元素,并跳过 offset 个,取出 N 个
- zrevrank key member:查询 member 排名(降序 0 名开始)
- zremrangebyscore key min max:按照 score 来删除元素,删除 score 在 `[min, max]` 之间
- zrem key value1 value2:删除集合中的元素
- zremrangebyrank key start end:按排名删除元素,删除名次在 `[start, end]` 之间的
- zcard key:返回集合元素的个数
- zcount key min max:返回 `[min, max]` 区间内元素数量
- `zinterstore dest numkeys key1[key2..] [WEIGHTS weight1 [weight2...]] [AGGREGATE SUM|MIN|MAX]`
- ```
求`key1,key2的交集,key1,key2的权值分别是weight1,weight2
聚合方法用 sum|min|max
聚合结果 保存子dest集合内
注意:weights,aggregate如何理解?
答:如果有交集,交集元素又有score,score怎么处理?aggregate num->score相加,min最小score,max最大score,另外可以通过weights设置不同的key的权重,交集时 score*weight
````
## 服务器相关命令
- ping:测定连接是否存活
- echo:在命令行打印一些内容
- select:选择数据库
- quit:退出连接
- dbsize:返回当前数据库中key的数目
- info:获取服务器的信息和统计
- monitor:实时转储收到的请求
- config get 配置项:获取服务器配置的信息
- config set 配置项 值:设置配置项信息
- flushdb:删除当前选择数据库中所有的 key
- flushall:删除所有数据库中的所有的 key
- time:显示服务器时间,时间戳(秒),微秒数
- bgrewriteaof:后台保存 aof 快照
- bgsave:后台保存 rdb 快照
- save:保存 rdb 快照
- lastsave:上次保存时间
- shutdown [save/nosave]问:多慢才叫慢? 答:由 slowlog-log-slower-than 10000,来指定(单位为微秒) 问:服务器存储多少条慢查询记录 答:由 slowlog-max-len 128,来做限制1
2
- showlog:显示慢查询