Redis 列表
list 简介
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
注:之所以说 Redis 列表是字符串列表,是因为 “字符串对象是 Redis 五种类型的对象中唯一一种会被其他四种对象嵌套的对象”。在本文中意思是说:列表对象嵌套了字符串对象。
list 的实现原理
编码方式
列表对象的编码方式可以是 ziplist[压缩列表] 或者 linkedlist[双端链表]
如果执行下述 RPUSH 命令, 那么服务器将创建一个列表对象作为 numbers 键的值。
redis> RPUSH numbers 1 "three" 5
1,如果 numbers 键的值对象使用的是 ziplist 编码,这个值对象将会是下图展示的样子
2,如果 numbers 键的值对象使用的是 linkedlist 编码,这个值对象将会是下图展示的样子
注:上图中的字符串对象是简化的,实质上字符串对象也是同列表对象一样,是一个 redisObject 对象,完整的字符串对象应该是下图所示
编码转换
当列表对象可以同时满足以下两个条件时,列表对象使用 ziplist 编码,否则使用 linkedlist 编码
1,列表对象保存的所有字符串元素的长度都小于 64 字节;
2,列表对象保存的元素数量小于 512 个;
注:以上两个条件的上限值是可以修改的,具体可以看配置文件中关于 list-max-ziplist-value 选项和 list-max-ziplist-entries 选项的说明。
常用命令
LPUSH key val [val2] [val3] // 将一个或多个元素插入到列表头部 LPUSHX key val // 只能把一个元素插入到已存在的列表表头【v >= 4.0 accept multiple element arguments】 RPUSH key val [val1] [val2] // 将一个或多个元素插入到列表表尾 RPUSHX key val // 只能把一个元素插入到已存在的列表表尾【if list not exist, do nothing】 LINSERT key before|after value val // 在列表中已存在的值 value 之前/后插入元素 val【只会把第一个找到的 value 作为 pivot】 LPOP key // 将列表中的表头元素弹出并返回 RPOP key // 将列表中的表尾元素弹出并返回 BLPOP key [key2] timeout // 将列表中的表头元素弹出,从前往后,只弹出一个列表的元素[BLOCK: 阻塞式 timeout: second] BRPOP key [key2] timeout // 将列表中的表尾元素弹出,只弹出一个列表的元素[BLOCK: 阻塞式 timeout: second] LTRIM key start stop // 将列表中索引从 start 到 stop 之间的元素保留,其它全部删除[start : stop] LREM key count val // 将一个列表中与值 val 相同的元素删除[count:绝对值代表删除的元素个数,正负代表删除的方向,0:代表删除所有] RPOPLPUSH source destination timeout //将 source 列表表尾元素移除,并将该元素插入到 destination 列表的表头 BRPOPLPUSH source destination timeout //将 source 列表表尾元素移除,并将该元素插入到 destination 列表的表头[阻塞式] LLEN key // 列表的长度 LINDEX key index // 列表中下标为 index 的元素的值 LRANGE key start stop // 列表范围内的所有元素[start : stop] LSET key index val // 设置列表中下标为 index 元素的值为 val
参考内容:
[1]:The Design and Implementation of Redis 黄健宏