一、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)来存储数据。