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、数据库管理
无,因为集群模式下,只能使用一个数据库,生产环境也是如此。