Redis 原理 - 数据结构拾遗

条目索引

条目正文

编码方式

11种编码方式
image1

image2

IntSet 整数集合

1.1 IntSet: 有序(二分) 且唯一,
image1

1.2 扩容时如果编码不合适自动升级编码: 并且倒序copy
image2

QuickList

图解
image1

1.QuickList引入解决大量数据的关联问题
image2

1.1优化
限制ziplist的entry数量
image3

压缩中间节点: 由于首位访问比较多, 因此通常不会进行压缩
image4

源码

image5

RedisObject

1.
image1

redisObject 总共占用 0.5 bytes + 0.5 bytes + 3 bytes + 4 bytes + 8 bytes = 16 bytes(字节)。

SDS 动态字符串

1.动态字符串SDS ( C语言实现的string毛病太多 )
image1

sds不以”\0”为字符串结束的表示,
而是将在sds中添加len字段记录其长度以期实现二进制安全的目的

Sds
image2

redisObject 总共占用 0.5 bytes + 0.5 bytes + 3 bytes + 4 bytes + 8 bytes = 16 bytes(字节)。
+len + alloc + flags + \0—>64-20=44

动态扩容能力:会预分配

image3

SkipList

image1

1.
image2

1.1 结构如下
image3

image4

ZipList

1.ZipList 双端链表
image1

1.1 ZipListEntry
image2

image3

由于计算机是由低地址向高地址存储,
但是人类的阅读书写顺序是从左往右,
电脑存储数据时,如果遇到高位低地址的数据就要先reverse成: 低位低地址–>高位高地址

image4

1.1.1 字符串编码
image5

1.1.2 整数编码
image6

2.1连锁更新问题

image7
大多数的entry都很小, 因此连锁更新的概率不大