redis数据类型对应底层数据结构
参考链接:https://blog.csdn.net/qq_35549286/article/details/126639070
redis常用数据类型
-
string
- string类型的编码方式有三种,即encoding有三种:int , embstr,raw
- value的值是整数,encoding对应的是int,没有特殊底层数据结构
- value长度小于32,对应encoding为embstr,长度大于32对应的encoding是raw;embstr和raw对应的底层数据结构都是sds(简单动态字符串)
- SDS 对应数据结构为:
struct sdshdr{
int len; // 字符串长度
int free; // 未使用的字节长度
char buf[]; // 保存字符串的字节数组
}
- string类型的编码方式有三种,即encoding有三种:int , embstr,raw
-
hash
- 当哈希对象的键值对个数小于512,并且所有键值对的长度都小于64字节时,使用压缩列表ziplist,否则使用hashtable
-
list
- 当列表的长度小于512,并且所有元素的长度都小于64字节时,使用压缩列表,否则使用linkedlist,redis3.2以后统一使用quicklist
-
set
- 如果集合中所有元素都可以转换成整数,并且长度小于512时,使用intset,否则使用hashtable.
-
zset
- 当集合元素个数小于128,并且所有元素长度都小于64字节时,使用压缩列表,否则使用skiplist
使用到的数据结构总结
- 压缩列表
- 压缩列表并不是说以某种算法压缩存储数据,它是一组连续的内存块,能够节省空间。
- 压缩列表的内存结构:
- zlbytes:占用4个字节,是压缩列表占用内存的字节数
- zltail:4个字节大小,记录表未节点距离起始地址的偏移量,用于快速定位尾节点位置
- zllen:2个字节大小,用于存储总共节点个数
- entry: 列表中的每一个元素
- previous_entry_ength:记录前一个entry节点的长度,用于快速寻找上一个元素的起始位置,因为他们是连续的
- encoding: content的内容类型和长度
- content: 每个节点的内容
- zlend: 压缩列表的结束语’0xFF’
- hashtable
- 类似java中的hashmap
- linkedlist,quicklist
- 双向链表
- intset:整数集合
- 元素:
- encoding: 编码方式,有INTSET_ENC_INT16,INTSET_ENC_INT32,INTSET_ENC_INT64三种
- contents[]:元素内容
- length: 元素内容长度
- 整数集合若是超过了的长度,就会进行扩容:
- 扩展数组contents的大小,并且数组的类型转化为新元素的类型
- 将原来数据中的元素转换为新元素的类型,并且放到新的数组中
- 整数集合在升级后不会降级,会一直保持升级后的状态
- 元素:
- skiplist: 跳跃表
- 跳跃表是具有多层结构的链表
- 由很多层组成,每一层都是一个有序的列表
- 由上到下每层数据逐渐密集,最上层的节点最稀疏,最下层的节点最密集
- 每一层的每一个节点都指向同一层的下一个节点,以及上一层的同一个位置的节点