Redis 原理 - 数据结构拾遗

条目索引

条目正文

编码方式

11种编码方式
b02d4ebf8e35c639e089c8dbbe911742ceae021f

39308b9034c840687c4d6e719843e38986d3d0fd

IntSet 整数集合

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

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

QuickList

图解
9b1908d1d7534e52af5746df184a0db229eef51f

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

1.1优化
限制ziplist的entry数量
b20a08898ad1119b59d1e37c2a925d018d55c7e6

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

源码

e0966ed8d0dba707122094cf1c8ca769ab97bd28

RedisObject

1.
7fce494fe741609bfd2c1dda20f5fc4c68eaf77a

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

SDS 动态字符串

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

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

Sds
6e7655eafc1532afa20f27e5822ed7df69d95b55

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

动态扩容能力:会预分配

01d536782a0babf01aa43ad89d4471cb984e079a

SkipList

ea515e74e821b767ea099878290bcebaf4c410e5

1.
5035bf3a08af28b446c055c22cd561e5c37e5498

1.1 结构如下
cebfaf4d5a3ab7b8e3f6bce857882a13514d5ad0

3465196292425c6f99292a0293824614fd285ddb

ZipList

1.ZipList 双端链表
7ef0c3f0be7a322e1b60e2e91051216b3bd026e9

1.1 ZipListEntry
98edd0541a8f0f2333ce049c91a5e3de9a0f5c41

f8d950ecd10ca286b43e78b0e9fa64841407ffa6

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

ef3342483d195163274f6f2d764202cb75a75366

1.1.1 字符串编码
18bad4a23120a99b0d7b772e87aa7a9ea06edf64

1.1.2 整数编码
8d0a62d915247ec64059b8a74fd566cc859b83c7

2.1连锁更新问题

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