Redis数据结构

63 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

Redis数据结构

有哪些数据结构?

  • String 字符串--对整个或部分进行操作,对整数或浮点数进行自增或自减操作
  • List 列表--对链表两端push或pop,读取单个或多个元素,根据值查找元素
  • Set 集合--添加获取删除+计算交集并集
  • Hash 哈希--添加获取删除
  • Zset 有序集合--字符串成员于浮点数分数之间的有序映射,排序由分数大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取

后面新增的有

  • bitmap: 二值统计,比如签到、判断用户登陆、连续签到用户总数
  • hyperloglog:海量数据基数统计
  • GEO:存储地理位置信息的场景,滴滴叫车
  • Stream:消息队列,相比于list 有自动生成全局唯一ID,支持以消费组形式消费数据

bitmap、hyperloglog、GEO、Stream

五种数据结构有哪些应用场景

  • String:缓存对象、常规计数、分布式锁、共享session信息
  • List:消息队列(要注意,生产者要自行实现全局唯一ID, 不能以消费组形式消费数据)
  • Hash:缓存对象、购物车等
  • Set:聚合计算(集合运算),比如点赞、关注、抽奖
  • Zset:排序场景:排行榜、电话、和姓名排序

五种数据结构的实现方式?

String

SDS(简单动态字符串),相比于C语言的原生字符串有以下优点

  • SDS不仅可以保存文本数据,还可以保存二进制数据。使用len值表示字符串结束,而不是空字符。所有API以处理二进制的方式处理SDS放在buf【】数组,不光能存文本,所有二进制文件图影音都可以。
  • SDS获取字符串的长度时间复杂度是O(1)
  • redis的SDS API安全,因为能够根据len检查SDS空间是否满足要求,不满足就会自动扩容

List

双链表或压缩列表

  • 如果列表元素<512个,并且每个元素的值<64字节,使用压缩列表,作为List底层数据结构。可以通过list-max-ziplist-entries 和 list-max-ziplist-value配置
  • 如果不满足,使用双向链表

在3.2版本之后,list只由quicklist实现

Hash

压缩列表或哈希表

  • 如果哈希类型元素个数<512个,所有值小于64字节,由压缩列表作为底层结构。通过hash-max-ziplist-value配置
  • 不满足,由哈希表实现

7.0版本中,ziplist被废除,交由listpack实现

Set

哈希表或整数集合

  • 个数<512,redis会使用整数集合作为Set类型的底层数据结构
  • 不满足,使用哈希表

Zset

压缩列表或跳表

  • 个数< 128 ,并且元素值小于64字节,使用压缩列表
  • 不满足,使用跳表

7.0版本中,废除ziplist,用listpack代替。

参考文章

数据结构详解