🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 2.7.4 列表对象(list) 列表对象的编码(encoding)可以是`ziplist`、`linkedlist` 当列表对象同时满足以下两个条件时,使用ziplist编码,否则使用linkedlist编码: - 所有元素长度小于64字节(可以通过`list-max-ziplist-value`设置) - 元素数量小于512个(可以通过`list-max-ziplist-entries`设置) ---- ``` redis> RPUSH numbers 1 "two" 3 (integer) 3 ``` 如果numbers键使用ziplist编码,则其值对象如下所示: ``` redisObject type: REDIS_LIST encoding: REDIS_ENCODING_ZIPLIST ptr -> ziplist: { zlbytes, zltail, zllen, 1, "two", 5, zlend } ... ``` 如果numbers键使用linkedlist编码,则其值对象如下所示: ``` redisObject type: REDIS_LIST encoding: REDIS_ENCODING_LINKEDLIST ptr -> linkedlist: { (stringObject: 1) -> (stringObject: "two") -> (stringObject: 5) } ... ``` > 字符串对象是Redis对象中唯一一种会被其他四种类型对象嵌套的对象 ---- 列表命令的实现: 命令 | ziplist的实现 | linkedlist的实现 ---- | ---- | ---- LPush | 调用ziplistPush函数,将新元素推入压缩列表的表头 | 调用listAddNodeHead函数,将新元素推入双向链表的表头 RPush | 调用ziplistPush函数,将新元素推入压缩列表的表尾 | 调用listAddNodTail函数T,将新元素推入双向链表的表尾 LPop | 调用ziplistIndex函数定位压缩列表的表头结点,返回元素后,调用ziplistDelete函数删除表头结点 | 调用listFirst定位双向链表的表头结点,调用listDelNode返回元素后删除表头结点 RPop | 调用ziplistIndex函数定位压缩列表的表尾结点,返回元素后,调用ziplistDelete函数删除表尾结点 | 调用listFirst定位双向链表的表头结点,调用listDelNode返回元素后删除表尾结点 LIndex | 调用ziplistIndex函数定位压缩列表中的指定结点,返回元素 | 调用llistIndex函数定位双向链表中的指定结点,返回元素 LLen | 调用ziplistLen函数返回压缩列表的长度 | 调用listLength函数返回双向链表的长度 LInsert | 插入到表头或表尾时,使用ziplistPush函数,否则使用ziplistInsert函数 | 调用listInsertNode函数,将新结点插入到双向链表指定的位置 LRem | 遍历压缩列表,并调用ziplistDelete函数删除包含了给定元素的结点 | 遍历双向列表,并调用listDelNode函数删除包含了给定元素的结点 LTrim | 调用ziplistDeleteRange函数,删除压缩列表中所有不在指定索引范围内的结点 | 遍历双向链表,调用listDelNode函数删除所有不在指定索引范围内的结点 LSet | 先调用ziplistDelete函数删除指定索引上的所有结点,然后调用ziplistInsert函数,将一个包含给定新元素的结点插入到相同索引上 | 调用listIndex函数,定位结点,通过赋值的形式更新结点的值