redis底层数据结构设计原理

一、redis的KEY

redis是以key-vlaue的键值对格式存储,不管vlaue是什么数据格式,key都是自定义的String类型。

二、String类型

redis的String类型是自定义的一种字符串数据结构sds(simple dynamic string)。

自定义的sds字符串有几个重要的属性,一个是字符占用空间长度(len),可用空间(free)和实际的字符串char数组。为什么redis要自己设计新的数据结构来存字符串,而不使用原生的呢?大体原因有两个,一个是因为redis是用C语言写的,C语言中/0表示结束,redis作为一个供不同语言调用的中间件,万一调用方传的字符串带了/0,这就容易导致出错;第二是新的数据结构如果经常对字符串操作,Redis可以分配更大的内存空间,就可以避免每次操作字符串都频繁的调整内存空间。

三、List类型

redis的list数据结构采用quickList(双端链表)和zipList作为底层的实现。

zipList属性:

zlbytes:  zipList占用的内存空间(32bit)

zltail:   指向zipLizt的最后一个节点(32bit)

zllen:  表示zipList中entry的个数(16bit)

entry[ ]:   真正存放数据实体entry的数组(长度不定)

entry:

         prerawlen:  前一个entry的数据长度

         len:  entry中的数据长度

        data:  真实的数据存储

zlend:  最后一个字节,固定值255(8bit)

 

quickList属性:

head:  指向quickList中的第一个quickListNode

tail: 指向quickList中的最后一个quickListNode

count: quickListNode元素个数

length:  quickList总的内存大小

。。。。。。

 

quickListNode属性:

prev: 指向前一个quickListNode节点

next:  指向后一个quickListNode节点

zl:  指向zipList地址 

length:  总的quickListNode内存空间

。。。。。。

 

可以通过设置每个ziplist的最大容量,quicklist的数据压缩范围,提升数据存取效率

list-max-ziplist-size  -2        //  单个ziplist节点最大能存储  8kb  ,超过则进行分裂,将数据存储在新的ziplist节点中 
list-compress-depth  1        //  0 代表所有节点,都不进行压缩,1, 代表从头节点往后走一个,尾节点往前走一个不用压缩,其他的全部压缩,2,3,4 ... 以此类推

四、hash类型

hash数据结构底层实现为字典(dict),通过K-V的方式来存储数据,但是当数据量比较小的时候,则使用zipList的方式,当数据量比较大时,则使用hashtable来存储数据。

可以通过配置文件设置什么时候开始使用hashtable的数据结构

hash-max-ziplist-entries  512    //  ziplist 元素个数超过 512 ,将改为hashtable编码 
hash-max-ziplist-value    64      //  单个元素大小超过 64 byte时,将改为hashtable编码

五、set类型

set为无序自动去重的数据结构,底层实现为value为空的字典(dict),当数据可以用整形表示时,set集合的数据将会编码为intset数据类型,否则如果满足以下两个条件,则使用hashtable来存储:

1、元素个数大于set-max-intset-entries设置的值;

2、数据不能用整数表示。

六、zset类型

zset为有序并且自动去重的数据类型,当数据较少时使用ziplist数据结构来存储,当数据变大时则使用字典(dict)+跳表(skiplist)来存储数据。

 

 

 

 

 

 

 

 

 

 

 

 

 

                   

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值