1、预备
1、全局命令
>0: 剩余过期时间
-1: 没有设置过期时间
-2: 键不存在
2、数据结构与内部编码
每种数据结构都有自己底层的内部编码实现,通过命令 OBJECT ENCODING key
来查看。
- string 内部编码:
raw
、int
、embstr
- hash 内部编码:
ziplist
、hashtable
- list 内部编码:
ziplist
、linkedlist
、quicklist
- set 内部编码:
intset
、hashtable
- zset 内部编码:
ziplist
、skiplist
2、string
1、常用命令
1
2
| SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
GET key
|
说明:
NX:不存在 key,才设置成功。同命令 SETNX key value
XX:存在 key,才设置成功。
1
2
| MSET key value [key value ...]
MGET key [key ...]
|
说明:
批量操作可以减少网络时间。
1
2
3
4
5
| INCR key
INCRBY key increment
INCRBYFLOAT key increment
DECR key
DECRBY key decrement
|
2、不常用的命令
1
| SETRANGE key offset value
|
3、内部编码
字符串内部编码有三种:
int
:8 个字节的长整型embstr
:小于等于 39 个字节的字符串raw
:大于 39 个字节的字符串
4、使用场景
- 缓存 (网站请求数据缓存)
- 计数 (网站的浏览数和播放数)
- 共享 Session (用户登录信息)
- 限速 (验证码接口)
3、hash
1、命令
1
2
| HSET key field value
HGET key field
|
1
| HDEL key field [field ...]
|
1
2
| HMSET key field value [field value ...]
HMGET key field [field ...]
|
说明:
field 个数比较多时,会阻塞 redis。
1
2
| HINCRBY key field increment
HINCRBYFLOAT key field increment
|
2、内部编码
ziplist
(压缩表):元素个数小于 hash-max-ziplist-entries = 512
,同时 value 小于 hash-max-ziplist-value = 64
,就使用 ziplist, 配置参数在 redis.conf 中。hashtable
(哈希表):无法满足 ziplist 的条件,会使用 hashtable。
4、list
1、命令
1
2
3
| RPUSH key value [value ...] # 右边添加
LPUSH key value [value ...] # 左边添加
LINSERT key BEFORE|AFTER pivot value # 指定位置插入
|
1
2
| LRANGE key start stop # 范围为[start, stop], 查询所有是 start = 0, stop = -1
LLEN key # 列表长度
|
1
2
3
4
| LPOP key # 左边弹出
RPOP key # 右边弹出
LREM key count value ## 删除 count 个 value 值, count > 0,从左边删除;count < 0,从右边删除;count = 0, 删除所有
LTRIM key start stop # 只保留[start, stop]的元素
|
1
| LSET key index value # 设置指定索引的值
|
1
2
3
| BLPOP key [key ...] timeout # 从左边弹出元素,如果为空,则阻塞
BRPOP key [key ...] timeout # 从右边弹出元素,如果为空,则阻塞
# timeout:阻塞时间。多个 key, 从左扫描。
|
2、内部编码
ziplist
(压缩表):元素个数小于 list-max-ziplist-entries = 512
,同时 value 小于 list-max-ziplist-value = 64
,就使用 ziplist, 配置参数在 redis.conf 中。linkedlist
(链表):无法满足 ziplist 的条件,会使用 linkedlist。
5、set
1、集合内操作
1
| SADD key member [member ...]
|
1
| SREM key member [member ...]
|
1
| SRANDMEMBER key [count]
|
2、集合间操作
1
2
3
| SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]
SDIFFSTORE destination key [key ...]
|
说明:
destination 表示目标 key。
key 表示需要操作的 key。
3、内部编码
intset
(整数集合):value 值为整型,个数小于 set-max-intset-entries = 512
时,使用 intset。配置参数在 redis.conf 中。hashtable
(哈希表):不满足 intset 条件时,使用 hashtable。
4、使用场景
标签系统:计算不同人相同喜好的标签 (SINTER命令)。
1
2
3
| SADD user1:tags tag1 tag2
SADD user2:tags tag2 tag3
SINTER user1:tags user2:tags
|
6、zset
1、集合内操作
1
2
3
| ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
# NX: 不存在 key,才设置成功
# XX: 存在 可以,才设置成功
|
1
2
| ZRANK key member # 从低到高
ZREVRANK key member # 从高到低
|
1
2
3
| ZREM key member [member ...] # 删除成员
ZREMRANGEBYRANK key start stop # 删除指定排名范围的成员
ZREMRANGEBYSCORE key min max # 删除指定分数范围的成员
|
1
| ZINCRBY key increment member
|
1
2
| ZRANGE key start stop [WITHSCORES] # 从低到高
ZREVRANGE key start stop [WITHSCORES] # 从高到底
|
1
2
3
| ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
# WITHSCORES:结果返回分数
# LIMIT offset count:限制返回个数
|
2、集合间操作
1
2
3
4
5
| ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
# destination:计算结果保存的键
# numkeys:参与的键,也就是 key 的总数
# weight:每一个 key 参与的权重,默认为 1
# AGGREGATE:聚合操作,默认为 sum
|
1
2
| ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
# 参数同 ZINTERSTORE
|
3、内部编码
ziplist
(压缩列表):个数小于 zset-max-ziplist-entries = 128
时,value 小于 zet-max-ziplist-value = 64
使用 ziplist。配置参数在 redis.conf 中。skiplist
(跳跃表):不满足 ziplist 条件时,使用 skiplist。
6、键管理
1、单个键管理
1
2
| RENAME key newkey # 存在 key,会覆盖
RENAMENX key newkey # 不存在 key,才重命名成功
|
1
2
3
4
| EXPIRE key seconds
# >0: 剩余过期时间
# -1: 没有设置过期时间;
# -2: 键不存在
|
Redis 不支持二级数据结构(哈希表、列表)过期
setex 原子命令设置 value 和 expire
1
2
3
4
5
| MOVE key db # 迁移到另一个db, 不建议使用,因为集群环境只能使用一个数据库
DUMP key; RESTORE key ttl serialized-value [REPLACE] # 操作麻烦,不建议使用
MIGRATE host port key| destination-db timeout [COPY] [REPLACE] [KEYS key] # 可以使用
# COPY: 迁移后不会删除源键
# REPLACE: 迁移后会覆盖目标库的键
|
示例:
迁移到 localhost:6380 的 db0 库上,timeout为 1000ms,命令为 MIGRATE localhost 6380 hello 0 1000
。
迁移多个键 k1, k2, k3,命令为 MIGRATE localhost 6380 "" 0 1000 KEYS k1 k2 k3
。
2、遍历键
1
| KEYS pattern # 键很多时,会阻塞 Redis
|
1
2
3
| SCAN cursor [MATCH pattern] [COUNT count]
# count: 每次查询 key 的个数。
# pattern: 同命令 scan。
|
说明:
第一次查询设置 cursor 为 0,结果会返回 cursor,如果 cursor 为 0,表示遍历结束,否则设置 cursor 为当前返回值,再次查询。
3、数据库管理
无,因为集群模式下,只能使用一个数据库,生产环境也是如此。