ziplist的组成和在数据类型中做为编码的使用
一个压缩列表my_zl的组成
- 属性 字节数 含义
- zlbytes 4B-my_zl全部内容占用的内存字节数
- zltail 4B 尾节点的偏移,O(1)地找到尾节点,不然要从头遍历
- zllen 2B my_zl中节点的数量,即后面entry的数量
- entry0 字节数不定 my_zl中的一个节点
- entry1
- …
- entryN
- zlend 1B 结束符 0xFF
一个压缩列表节点的组成
- previous_entry_length 1B或5B 前一个节点的字节长度
- encoding 1B或2B或5B content保存的数据类型以及长度
- content 长度不定 一个字节数组或一个整数
ziplist编码的List
lpush rpush分别向头和尾添加节点
ziplist编码的Sorted Set
存储格式
| member-1 | score-1 | member-2 | score-2 | … | member-N | score-N |
void zaddGenericCommand(redisClient *c, int incr)
按score的大小顺序存储
- 添加:遍历,找第一个比score大的节点,插入到它前面
- 查找:遍历ziplist
- 修改:删除原来的member和score
ziplist编码的Hash表
存储格式
| field-1 | value-1 | field-2 | value-2 | … | field-N | value-N |
int hashTypeSet(robj *o, robj *field, robj *value)
与Hash无关的存储,先来后到的存储顺序
- 添加:添加到ziplist末尾,先添加field,后添加value
- 查找:遍历整个ziplist
- 修改:找到field节点,删除旧的value节点,在field后插入新的value节点