Redis底层数据结构的映射关系
  TEZNKK3IfmPf 2023年11月14日 10 0

阅读文本大概需要3分钟。

        Redis有五种基本数据结构:字符串、hash、set、zset、list。但是你知道构成这五种结构的底层数据结构是怎样的吗?

0x01:Redis底层八种数据结构

  • 简单动态字符串 SDS (simple synamic string):支持自动动态扩容的字节数组

  • 链表 list :链表

  • 字典 dict :使用双哈希表实现的, 支持平滑扩容的字典

  • 跳跃表 zskiplist :附加了后向指针的跳跃表

  • 整数集合 intset :用于存储整数数值集合的自有结构

  • 压缩列表 ziplist :一种实现上类似于TLV, 但比TLV复杂的, 用于存储任意数据的有序序列的数据结构

  • quicklist:一种以ziplist作为结点的双链表结构, 实现的非常不错

  • zipmap :一种用于在小规模场合使用的轻量级字典结构 

Redis底层数据结构的映射关系

0x02:Redis五种存储类型与底层八数据结构的映射关系

         Redis五种存储类型与八种数据结构的桥梁, 是redisObject;Redis中的Key与Value在表层都是一个redisObject实例, 所以该结构有所谓的"类型", 即是ValueType.。对于每一种Value Type类型的redisObject;其底层至少支持两种不同的底层数据结构来实现。

Redis底层数据结构的映射关系

来自《Redis设计与实现第二版》

  • 字符串

字符串类型对应Redis底层三种数据结构,分表是int、raw和embstr。

(a)当Value是数字的时候,对应int

(b)当字符串长度比较短(长度不大于39字节)时,对应embstr

(c)当字符串长度比较长(长度大于39字节)时,对应raw

其中embstr和raw都是由SDS动态字符串构成的。唯一区别是:raw是分配内存的时候,redisobject和 sds 各分配一块内存,而embstr是redisobject和raw在一块儿内存中。

  • 列表

(a)列表对象所有字符串元素长度都小于64字节或者元素数量小于512时,对应ziplist

(b)不满足ziplist条件的其他情况,对应list  双向量表 

  • hash

(a)元素数量小于512或者所有元素长度小于64字节时,对应ziplist 缩列表 

(b)不满足ziplist条件的其他情况,对应dic 字典(也就是哈希表)

  • set

(a)所有元素都是整数或者元素数量小于512时,对应整数集合 inset

(b)不满足inset条件的其他情况,对应dic  字典(也就是哈希表)

  • zset

(a)元素数量小于128或者所有元素长度小于64字节,对应ziplist 压缩列表 

(b)不满足ziplist条件的其他情况,对应跳跃表 zskiplist 

最后介绍一个命令来显示五种数据类型的底层数据结构

            OBJECT ENCODING    key  

Redis底层数据结构的映射关系

上面的命令给string 数据类型 k1赋值str,给 k2赋值123,通过 OBJECT ENCODING 命令,显示底层实现的数据类型分别是 embstr 和 int。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   23   0   0 redis用户
  TEZNKK3IfmPf   2024年05月31日   27   0   0 dataredis
  TEZNKK3IfmPf   2024年05月31日   23   0   0 awkredis
  TEZNKK3IfmPf   2024年05月17日   31   0   0 字符串php
TEZNKK3IfmPf