redis 数据结构

32 阅读2分钟

redis 常见的 5 中数据类型

image.png

版本更替后面又加入了四种数据类型, bitmap, heyperloglog, GEO, stream,

应用场景:

  1. string :缓存对象,常规计数,分布式锁,共享 session信息等
  2. list :消息队列,但又两个问题(生产者需要自己实现全局唯一的 id ,并且不能以消费组的形式消费数据)
  3. set :聚合运算场景(并集,交集,差集),共同关注,点赞抽奖活动,点赞
  4. hash :缓存对象,购物车等
  5. zset :排序场景,排行榜
  6. bitmap :二值统计场景,比如签到,用户登录状态,连续签到用户总数也可以
  7. hyperloglog :基数统计,海量数据基数统计
  8. GEO :地理信息存储,比如滴滴打车
  9. steam :消息队列,但他解决了 list 消息队列的两个问题, 它可以自动生成 id ,支持消费组形式消费数据

常见数据类型的底层数据结构

image.png

string :redis 虽然是基于 c 语言开发,但它的 string 类型底层并没有使用 c 语言的字符串表示,而是 SDS(简单动态字符串)结构,它可以保存二进制数据,也就是可以保存图片,视频,压缩文件这种。SDS 获取字符长度也是 O(1)复杂度的,因为它有 len 属性。并且它在拼接字符串时不会缓存区溢出,因为合并前会检查空间是否足够,不够会扩容。

list :双向链表和压缩列表,如果元素个数少于 512 个,且每个元素的值都小于 64 个字节,则会使用压缩列表,否则使用双向链表,当然阈值可以通过改配置来修改,但 redis 3.2 版本后,list 底层只用 quiklist 实现,替代了双向链表和压缩列表

hash :同样和 list 一样个数小于,元素值小于则用压缩列表,(但在 redis 7.0 版本中 listpack 取代压缩列表),不满足条件就用 哈希表

set :个数小于 512 且是整数集合,则用 整数集合实现,否则则用哈希表实现

zset : 个数小于 128, 元素小于 64,使用压缩列表,(7.0 版本之后,listpack 取代 压缩列表),否则使用调表