string 字符串

键值结构

字符串数据类型的值可以是:string、int、二进制类型

值类型
hello world string 类型
city 10 int 类型
bits 10101010 二进制类型/位图
json {“city”: 1, “people”: 100} json 字符串类型、xml等

限制:值最大不能超过 512MB 。一般日常使用,考虑带宽、内存使用,建议在 100 KB 以内。

应用场景

  1. 缓存
  2. 计数器
  3. 分布式锁
  4. ……

    常用命令

  5. 获取/设置/删除:get/set/del

  6. 递增/递减:incr/decr/incrby/decrby
  7. 存在/不存在设置:setnx/setxx
  8. 批量获取/设置:mget/mset
  9. 设置新值并返回旧值/将值追加到旧值后/返回字符串长度(注意中文):getset/append/strlen
  10. 递增浮点值/获取下标值/设置下标值:incrbyfloat/getrange/setrange

hash 哈希

键值结构

key field value
user:1:info id 1
name 张三
sex

应用场景

  1. 记录每个用户主页的访问量
  2. 缓存商品的基本信息
  3. 常用命令

  • 获取/设置/删除:hget/hset/hdel
  • 判断field是否存在/获取所有field的数量:hexists/len
  • 获取/设置一批field的值:hmget/hmset
  • 返回所有的field和值/返回key所有的value/返回key所有的field:hgetall/hvals/hkeys
  • 设置不存在的值/递增/递增浮点数:hsetnx/hincrby/hincrbyloat

    注: hgetall 使用应注意性能

说明:Hash 比 String 更节约内存;(官网参考数据:Hash最小利用与 String 的内存空间节省约 5 倍)

list 列表

列表结构

key elements
user:1:messages a、b、c、d、e、f…

特点:有序、可重复、两端插入值

应用场景

  • timeline:如微博、朋友圈时间轴业务实现
  • 队列
  • 常用命令

  • 从右/左边插入1或多个值:rpush/lpush

  • 在指定可以的某个值的前面/后面追加一个值:linsert(时间复杂度O(n),会遍历列表所有值)
  • 从左/右边取出(并删除)一个元素:lpop/rpop
  • 从左边删除X个value元素:lrem
    • 语法:lren key count value,并返回删除成功的数量
    • count > 0,从左到右删除符合的数量
    • count < 0,从右到左删除符合的数量
    • count = 0,删除所有符合的数量
  • 修剪指定范围的的元素:ltrim;语法:ltrim key start stop
    • 适用大列表删除,减少 redis 慢速
  • 返回指定范围的元素:lrange
  • 返回指定下标的元素:lindex
  • 获取列表的长度:llen
  • 设置指定下标的值:lset

    set 集合

    键值结构

    | key | elements | | —- | —- | | user:1:follow | a、b、c、d、e、f… |

特点:无序、不可重复、支持集合间操作

应用场景

  • 用户关注清单
  • 抽奖系统:随机抽取X名(spop)
  • like、点赞、踩的实现
  • 用户行为标签:用户添加标签;标签添加用户;

    常用命令

  • 添加、删除元素:sadd/srem

  • 计算集合总数/判定集合是否有指定元素/随机取出指定数量元素/取出集合所有元素:scard/sismember/srandmember/smembers
    • 其中 smembers 返回结果是无序的;且是返回所有,在生产环境应注意使用。
  • 从集合中随机取出(并删除)指定数量的元素:spop

集合间命令

  • 差集:sdiff
  • 交集:sinter
  • 并集:sunion
  • 差集/交集/并集存储到新的集合:sdiffstore/sinterstore/sunionstore

示例:

key elements
user:1:follow it、music、his、sports
user:2:follow it、news、ent、sports
类型 命令 结果
差集 sdiff user:1:follow user:2:follow his、music
交集 SINTER user:1:follow user:2:follow it、sports
并集 SUNION user:1:follow user:2:follow it、music、his、sports、news、ent

zset 有序集合

键值结构

key score value
user:ranking 10 张三
11 李四

集合 vs 有序集合 vs 列表

类别 集合 有序集合(zset) 列表
重复性 无重复元素 无重复元素 有重复元素
排序 无序 有序 有序
数据 元素 分值+元素 元素

应用场景

  • 排行榜功能

    常用命令

  • 增加/删除:zadd/zrem

    • zadd key score valuezadd dd 99 aaazadd dd 99 aaa 88 bbb 77 ccc
    • zrem key valuezrem dd aaa
  • 返回元素的分数:zscore
    • zscore key valuezscore dd bbb
  • 自增:zincrby
    • zincrby key incrment valuezincrby dd 11 bbb
  • 返回集合总数:zcard
    • zcard keyzcard dd
  • 返回可以指定范围的升序元素:zrange
    • zrange key start stop [withscores]zrange dd 0 -1
    • withscores 可将分数打印出来
  • 返回指定分数范围内的升序元素:zrangebyscore
    • zrangebyscore key minscore maxscorezrangebyscore dd 2 3
  • 返回指定分数范围内的元素总数:zcount
    • zcount key minscore maxscorezcount dd 2 3
  • 删除指定排名内的升序元素/珊瑚指定分数范围内的升序元素:zremrangebyrank/zremrangebyscore
    • zremrangebyrank key start stopzremrangebyrank`` dd 1 2
    • zremrangebyscore key minscore maxscorezremrangebyscore `` dd 1 2