1、概述
单键多值:Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
2、相关操作
- lpush key value1 [value2]--------------将一个或多个值插入到列表头部,返回插入数量,从1开始
- lpushx key value--------------将一个值插入到已存在的列表头部,返回integer,0-插入失败,成功返回当前list数量
- rpush key value1 [value2]--------------在列表中添加一个或多个值,返回integer,0-插入失败,成功返回当前list数量
- rpushx key value------------------为已存在的列表添加值,返回integer,0-插入失败,成功返回当前list数量
- lset key index value--------------通过索引设置列表元素的值
- linsert key BEFORE|AFTER pivot value----------------在列表的元素(pivot)前或者后插入元素,返回integer,-1-插入失败,成功返回当前list数量
- brpoplpush source destination timeout---------------从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹
- lindex key index------------------通过索引获取列表中的元素
- llen key----------------获取列表长度
- lrange key start stop-----------------获取列表指定范围内的元素,start、stop超出范围,只返回范围内存在的元素
- blpop key1 [key2 ] timeout-----------------移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
- brpop key1 [key2 ] timeout------------------移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
- rpoplpush source destination--------------移除列表的最后一个元素,并将该元素添加到另一个列表并返回
- lpop key-------------------移出并获取列表的第一个元素
- lrem key count value--------------移除列表中count个value元素,返回移除成功的数量
- rpop key---------------移除并获取列表最后一个元素
- ltrim key start stop---------------对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
3、数据结构
- List 的数据结构为快速链表 quickList。
- 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
- 当数据量比较多的时候才会改成 quicklist。因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是 int 类型的数据,结构上还需要两个额外的指针 prev 和 next。
- Redis 将链表和 ziplist 结合起来组成了 quicklist。也就是将多个 ziplist 使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。