1.SDS动态字符串
属性:字符数组、length、free(可用空间)
embstr和raw都是由SDS动态字符串构成的。唯一区别是:raw是分配内存的时候,redisobject和 sds 各分配一块内存,而embstr是redisobject和raw在一块儿内存中。
优点:
c语言中字符串如果修改需要重新分配空间,否则会出现数据溢出;sds如果字符串变动不必每次开辟新空间,当可用空间不足时,扩容为原空间2倍。
c语言获取字符串长度需要遍历,sds可直接获取
2.链表
属性:头节点、尾节点、元素个数
节点属性:前置、后置、值
优点:
包含头尾节点和length,元素可以存放不同类型的值
3.哈希表
属性:元素数组、数组长度、元素个数、
元素属性:key,value,next
next用来存放hash冲突时的节点
类似于java中的HashMap
4.字典
包含两个哈希表,一个rehash标识(-1标识正在rehash),用于rehash重新散列,rehash是渐进性操作满足rehash条件之后,每次的增删查操作都会进行节点迁移,避免因大批量数据迁移导致服务崩溃
5.跳跃表
属性:头节点、尾节点、节点数量、层数
跳跃表是一种有序的结构,是zset的实现方法之一
6.压缩表
属性:zlbytes总字节长度、zltail尾节点距离头起始地址字节长度、zllen包含节点数量、entryX各个节点、zlend标记压缩表结尾,类似一种协议、约定
Redis各数据类型使用的存储方式
字符串
int 数字
raw 长字符串 长度大于39字节
embstr 短字符串 长度不大于39字节 只读, 如果要写, 则先转换为raw
后来版本的redis使用44做为embstr和raw的区分了
list
ziplist 每个元素长度小于64字节 且元素数量小于512
双向链表 其他情况
hash
ziplist 每个元素长度小于64字节 且元素数量小于512
哈希表 其他情况
set
intset 每个元素都是整形,且元素数量小于512
哈希表 其他情况
zset
ziplist 每个元素长度小于64字节 且元素数量小于128
跳表 其他情况