一、redis的基本数据类型
0.压缩列表(基础类型)
redis独特的数据结构,不直接使用,是一种基础数据类型。没有指针,但是同时有变长编码(数组不具备的动态节点数据类型和节点长度)的特性。相当于把链表去掉指针,压缩放进一段连续内存中,通过编码的偏移量关联,节省了内存开销。具体结构如下。
zlbytes | zltail | zllen | entry1 | entry2 | ... | entryN | zlend
-
zlbytes:记录整个压缩列表占用的字节数。
-
zltail:记录尾节点到起始地址的偏移量,便于快速从尾部操作。
-
zllen:记录节点数量(小于 65535 时准确,超过时需遍历)。
-
entryX:每个节点存储一个元素,节点结构包含前一节点长度(用于反向遍历)、编码(记录数据类型和长度)、实际数据。
-
zlend:结束标志(固定值 0xFF)。
1.String字符串
SDS结构:len、free、buf[]。
2.List列表
数据量少时使用压缩列表,由于每个节点需要保存前一节点的长度,在修改数据时可能产生O(N²)的连锁反应,所以数据量大时使用双向链表。Redis 3.2 以后都使用quickList 。即多个压缩列表节点组成的双向链表。这种结构避免了修改数据时产生大规模的连锁反应,提高了修改数据的效率,又很好地利用了压缩列表节省内存开销。压缩列表实现如下面示例。
zlbytes | zltail | zllen | entry1 | entry2 | ... | entryN | zlend
3.Set集合
少于512个整数数据时使用整形数组,否则使用哈希表。
4.Zset有序集合
数据量少时使用压缩列表,当时数据量大时就要使用跳表。比如需要查看某特定排名区间的数据,使用跳表时总能达到O(log N)的性能,使用压缩列表则是O(N),当这个N很大时,性能消耗就很大了。跳表逻辑上类似平衡二叉树,都是通过上层父节点开始向下层数据检索,可以快速找到目标数据。跳表由多个“层”组成,最底层是包含所有元素的有序链表。压缩列表示例如下,和List差不多样,不过每个节点有score,且按score升序排列。
zlbytes | zltail | zllen | member1 | score1 | member2 | score2 | ... | memberN | scoreN | zlend
下面是跳表的结构:
-
每个节点包含一个元素(member) 和分值(sc


371

被折叠的 条评论
为什么被折叠?



