Redis五种数据类型

129 阅读7分钟

String(SDS)字符串

常用命令

  • SET key value: 设置指定key的值
  • SETNX key value: 只有在key不存在时设置key的值
  • GET key: 获取指定key的值
  • MSET key1 value1 key2 value2 ...: 设置一个或多个指定key的值
  • MGET key1 key2 ...: 获取一个或多个指定key的值
  • STRLEN key: 返回 key 所储存的字符串值的长度
  • INCR key: 将key中储存的数字值加一
  • DECR key: 将key中储存的数字值减一
  • EXISTS key: 判断指定key是否存在
  • DEL key: 删除指定的key
  • EXPIRE key seconds: 给指定key设置过期时间

应用场景

需要存储常规数据的场景

  • 举例 :缓存 session、token、图片地址、序列化后的对象(相比较于 Hash 存储更节省内存)
  • 相关命令 : SET、GET

需要计数的场景

  • 举例 :用户单位时间的请求数(简单限流可以用到)、页面单位时间的访问数。
  • 相关命令 :SET、GET、 INCR、DECR 。

分布式锁

利用 SETNX key value 命令可以实现一个最简易的分布式锁(存在一些缺陷,通常不建议这样实现分布式锁)

Hash(哈希表、压缩列表)散列

  • 当hash字段较少时(默认少于512个),使用 ziplist(压缩列表)存储,可以减少内存占用
  • 当hash字段较多时(默认超过512个),使用哈希表存储,可以快速定位每个字段
  • 当新增字段导致超过ziplist的限制时,Redis会自动将数据结构更换为哈希表

常用命令

  • HSET key field value: 设置指定哈希表中指定字段的值
  • HSETNX key field value: 只有指定字段不存在时设置指定字段的值
  • HMSET key field1 value1 field2 value2 ...: 同时将一个或多个field-value(域-值)对设置到指定哈希表中
  • HGET key field: 获取指定哈希表中指定字段的值
  • HMGET key field1 field2 ...: 获取指定哈希表中一个或者多个指定字段的值
  • HGETALL key: 获取指定哈希表中所有的键值对
  • HEXISTS key field: 查看指定哈希表中指定的字段是否存在
  • HDEL key field1 field2 ...: 删除一个或多个哈希表字段
  • HLEN key: 获取指定哈希表中字段的数量
  • HINCRBY key field increment: 对指定哈希中的指定字段做运算操作(正数为加,负数为减)

应用场景

对象数据存储场景

  • 举例 :用户信息、商品信息、文章信息、购物车信息
  • 相关命令 :HSET(设置单个字段的值)、HMSET(设置多个字段的值)、HGET(获取单个字段的值)、HMGET(获取多个字段的值)

Set(哈希表、整数集合)集合

  • 当集合元素较少时(默认少于512个),使用 intset(整数集合)存储,可以减少内存占用
  • 当集合元素较多时(默认超过512个),使用 dict(字典)存储,可以快速判断一个元素是否在集合中
  • 当新增元素导致超过intset的限制时,Redis会自动将数据结构更换为dict

常用命令

  • SADD key member1 member2 ...: 向指定集合添加一个或多个元素
  • SMEMBERS key: 获取指定集合中的所有元素
  • SCARD key: 获取指定集合的元素数量
  • SISMEMBER key member: 判断指定元素是否在指定集合中
  • SINTER key1 key2 ...: 获取给定所有集合的交集
  • SINTERSTORE destination key1 key2 ...: 将给定所有集合的交集存储在destination中
  • SUNION key1 key2 ...: 获取给定所有集合的并集
  • SUNIONSTORE destination key1 key2 ...: 将给定所有集合的并集存储在destination中
  • SDIFF key1 key2 ...: 获取给定所有集合的差集
  • SDIFFSTORE destination key1 key2 ...: 将给定所有集合的差集存储在destination中
  • SPOP key count: 随机移除并获取指定集合中一个或多个元素
  • SRANDMEMBER key count: 随机获取指定集合中指定数量的元素

应用场景

需要存放的数据不能重复的场景

  • 举例:网站UV统计、文章点赞、动态点赞等场景
  • 相关命令:SCARD(获取集合数量

需要获取多个数据源交集、并集和差集的场景

  • 举例 :共同好友(交集)、共同粉丝(交集)、共同关注(交集)、好友推荐(差集)、音乐推荐(差集)、订阅号推荐(差集+交集)等场景
  • 相关命令:SINTER(交集)、SINTERSTORE(交集)、SUNION(并集)、SUNIONSTORE(并集)、SDIFF(差集)、SDIFFSTORE(差集)
  • 集合类型比较典型的使用场景是标签(tag).例如一个用户可能对音乐感兴趣,另一个用户对新闻感兴趣,这些想去点就是标签.有了这些数据就可以获得喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验来说比较重要

需要随机获取数据源中的元素的场景

  • 举例 :抽奖系统、随机。
  • 相关命令:SPOP(随机获取集合中的元素并移除,适合不允许重复中奖的场景)、SRANDMEMBER(随机获取集合中的元素,适合允许重复中奖的场景)

List(双向链表、压缩列表)列表

  • 当列表较小时(元素数量默认小于512),使用 ziplist(压缩列表)存储,节省内存空间
  • 当列表较大时(元素数量默认大于512),使用 linkedlist(双向链表)存储,便于从两端快速插入和删除
  • 当插入元素导致 ziplist超过限制时,Redis会自动将列表数据结构变更为linkedlist

常用命令

  • RPUSH key value1 value2 ...: 在指定列表的尾部(右边)添加一个或多个元素
  • LPUSH key value1 value2 ...: 在指定列表的头部(左边)添加一个或多个元素
  • LSET key index value: 将指定列表索引index位置的值设置为value
  • LPOP key: 移除并获取指定列表的第一个元素(最左边)
  • RPOP key: 移除并获取指定列表的最后一个元素(最右边)
  • LLEN key: 获取列表元素数量
  • LRANGE key start end: 获取列表start和end之间的元素

应用场景

信息流展示

  • 举例 :最新文章、最新动态
  • 相关命令 : LPUSH、LRANGE

消息队列

Redis List 数据结构可以用来做消息队列,只是功能过于简单且存在很多缺陷,不建议这样做

SortedSet(跳表、压缩列表)有序集合

  • 当元素较少时(默认少于128个),使用 ziplist(压缩列表)存储,可以减少内存占用
  • 当元素较多时(默认超过128个),使用 zset(跳表)存储,可以快速完成排序、查询等操作
  • 当新增元素导致 ziplist 超限时,Redis 会自动将数据结构变更为 zset

常用命令

  • ZADD key score1 member1 score2 member2 ...: 向指定有序集合添加一个或多个元素
  • ZCARD key: 获取指定有序集合的元素数量
  • ZSCORE key member: 获取指定有序集合中指定元素的score值
  • ZINTERSTORE destination numkeys key1 key2 ...: 将给定所有有序集合的交集存储在destination中,对相同元素对应的score值进行SUM聚合操作,numkeys为集合数量
  • ZUNIONSTORE destination numkeys key1 key2 ...: 求并集,其它和 ZINTERSTORE 类似
  • ZDIFF destination numkeys key1 key2 ...: 求差集,其它和ZINTERSTORE类似
  • ZRANGE key start end: 获取指定有序集合start和end之间的元素(score从低到高)
  • ZREVRANGE key start end: 获取指定有序集合start和end之间的元素(score从高到低)
  • ZREVRANK key member: 获取指定有序集合中指定元素的排名(score从大到小排序)

应用场景

需要随机获取数据源中的元素根据某个权重进行排序的场景

  • 举例 :各种排行榜比如直播间送礼物的排行榜、朋友圈的微信步数排行榜、王者荣耀中的段位排行榜、话题热度排行榜等等
  • 相关命令 :ZRANGE (从小到大排序) 、 ZREVRANGE (从大到小排序)、ZREVRANK (指定元素排名)

需要存储的数据有优先级或者重要程度的场景

比如优先级任务队列。

  • 举例 :优先级任务队列
  • 相关命令 :ZRANGE (从小到大排序) 、 ZREVRANGE (从大到小排序)、ZREVRANK (指定元素排名)