Redis数据类型,Redis的底层数据结构,String, List(LinkedList,ZipList,QuickList),Set,ZSet,Hash(哈希表,压缩列表)

时间:2025-04-03 09:06:39

目录

1 String

2 List(LinkedList,ZipList,QuickList)

3 Set(哈希表)

4 ZSet(跳表,哈希表,压缩列表)

5 Hash(哈希表,压缩列表)


1 String

1、RAW分为两部分,redisobject他是后面指向SDS,先申请redisObject的内存空间,在申请SDS的内存空间,释放也有两次操作,所以性能差

2、EMBSTR只有一部分redisobjectSDS合并了,申请一块内存空间就行了,字符串大小在44字节以内就是这种模式,两块加一起也不超过64字节

3、INT编码:存储的是整数类型,转为二进制位

2 List(LinkedList,ZipList,QuickList)

类似链表 两边操作

1、LinkedList:普通链表,可以双端访问,占用空间高,内存碎片多

2、ZipList:压缩链表,可以双端操作,内存占用低,存储上限低通过记录节点的大小来推算出内存地址,当前节点记录的是前一个节点,减去或加上当前节点就能得到前后节点的地址

3、QuickLIst(3.2以后):LInkedList+ZipList,双端访问,内存占用低,包含多个ZipList,存储上限高

3 Set(哈希表)

有交集和并集的功能,好友的共同关 注,保证元素的唯一,判断元素是否存在,

哈希表(Dict字典)

1、为了查询效率和唯一性,set采用的HT编码(Dict),Dict的key来存储元素,value统一为null

2、当存储的所有数据都是整数,并且元素不超过set-max-intset-entries(可以在配置文件中配)时,set会采用IntSet编码(底层可以看做一个变长的数组,底层会排序,二分查找算法进行快速查找),节省内存

4 ZSet(跳表,哈希表,压缩列表)

可排序,分为score(值)值和member(键)值

根据score排序

member必须唯一

可根据member查询分数

键值存储,键必须唯一,可排序

SkipList(跳表):可排序,并且可以同时存储score和ele值(member)

HT(Dict):可以键值存储,并且根据key找value

内部同时有这两种,当元素不多的时候,优势不明显,浪费内存,因此会采用ZipList结构来节省空间

满足 :元素数量 zset_max_zeplist_entries,默认128 ,元素大小小于64字节

5 Hash(哈希表,压缩列表)

因为特性和ZSet基本上差不多,所以底层编码采用的编码与Zset基本上一致,只需要把排序有关的SkipList去掉即可

Hash结构默认采用ZipList编码,用以节省内存

当数据量较大时,Hash结构会转为HT编码,也就是Dict,触发条件:

满足 :元素数量 zset_max_zeplist_entries,默认512 ,元素大小小于64字节