1、预备

1、全局命令

  • help
1
  HELP command 
  • 查看所有的key
1
  KEYS *
  • 键总数
1
  DBSIZE
  • 检查键是否存在
1
  EXISTS key
  • 删除键
1
  DEL key
  • 键过期
1
  EXPIRE key sencond
  • ttl 返回过期时间
1
  TTL key

>0: 剩余过期时间

-1: 没有设置过期时间

-2: 键不存在

  • key的数据结构类型
1
  TYPE key

2、数据结构与内部编码

每种数据结构都有自己底层的内部编码实现,通过命令 OBJECT ENCODING key 来查看。

  • string 内部编码: rawintembstr
  • hash 内部编码: ziplisthashtable
  • list 内部编码: ziplistlinkedlistquicklist
  • set 内部编码: intsethashtable
  • zset 内部编码: ziplistskiplist

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
  APPEND key value
  • 字符串长度
1
  STRLEN key
  • 设置并返回原值
1
  GETSET key value
  • 设置指定位置的字符
1
  SETRANGE key offset value
  • 获取部分字符串
1
  GETRANGE key start end

3、内部编码

字符串内部编码有三种:

  • int:8 个字节的长整型
  • embstr:小于等于 39 个字节的字符串
  • raw:大于 39 个字节的字符串

4、使用场景

  • 缓存 (网站请求数据缓存)
  • 计数 (网站的浏览数和播放数)
  • 共享 Session (用户登录信息)
  • 限速 (验证码接口)

3、hash

1、命令

  • 设置值、获取值
1
2
  HSET key field value
  HGET key field
  • 删除 field
1
  HDEL key field [field ...]
  • 计算 field 的个数
1
  HLEN key
  • 批量设置、批量获取
1
2
  HMSET key field value [field value ...]
  HMGET key field [field ...]
  • 是否存在 field
1
  HEXISTS key field
  • 获取所有的 field
1
  HKEYS key
  • 获取所有的 value
1
  HVALS key
  • 获取所有的 field-value
1
  HGETALL key

说明:

field 个数比较多时,会阻塞 redis。

  • 计数
1
2
  HINCRBY key field increment
  HINCRBYFLOAT key field increment
  • 获取 value 长度
1
  HSTRLEN key field

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
  SCARD key 
  • 是否在集合中
1
  SISMEMBER key member # 
  • 随机返回 count 个元素,不会删除元素
1
  SRANDMEMBER key [count] 
  • 随机弹出 count 个元素,会删除元素
1
  SPOP key [count]
  • 获取所有元素
1
  SMEMBERS key

2、集合间操作

  • 多个集合的交集
1
  SINTER key [key ...]
  • 多个集合的并集
1
  SUNION key [key ...]
  • 多个集合的差集
1
  SDIFF key [key ...]
  • 将交集、并集、差集的结果保存
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
  ZCARD key
  • 获取某个成员的分数
1
  ZSCORE key member
  • 获取某个成员的排名
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:限制返回个数
  • 获取指定分数范围的成员个数
1
  ZCOUNT key min max

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
  RANDOMKEY
  • 键过期
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、数据库管理

无,因为集群模式下,只能使用一个数据库,生产环境也是如此。

0%