一、简介
列表类型 (List) 是一个使用链表结构存储的有序结构,它的元素插入会按照先后顺序存储到链表结构中,因此它的元素操作 (插入/删除) 时间复杂度为 O(1),查询时间复杂度为 O(n)。
二、基础使用
1、给列表添加一个或多个元素
语法:lpush key value [value ...]
127.0.0.1:6379> lpush list 1 2 3
(integer) 3
2、给列表尾部添加一个或多个元素
语法:lpush key value [value ...]
127.0.0.1:6379> lpush list 1 2 3
(integer) 3
2、给列表尾部添加一个或多个元素
语法:rpush key value [value ...]
127.0.0.1:6379> rpush list 4 5 6
(integer) 3
2、给列表尾部添加一个或多个元素
语法:lpush key value [value ...]
127.0.0.1:6379> lpush list 1 2 3
(integer) 3
3、返回列表指定区间内的元素
语法:lrange key start stop
其中 -1 代表列表中的最后一个元素
127.0.0.1:6379> lrange list 0 -1
"6"
"5"
"4"
"3"
"2"
"1"
4、获取并删除列表的第一个元素
语法:lpop key
127.0.0.1:6379> lpop list
"6"
127.0.0.1:6379> lrange list 0 -1
"5"
"4"
"3"
"2"
"1"
5、获取并删除列表的最后一个元素
语法:rpop key
127.0.0.1:6379> rpop list
"1"
127.0.0.1:6379> lrange list 0 -1
"5"
"4"
"3"
"2"
6、根据下标获取对应的元素
语法:lindex key index
127.0.0.1:6379> lindex list 0
“2”
7、根据下标修改元素
语法:lset key index value
127.0.0.1:6379> lset list 0 8
OK
127.0.0.1:6379> lindex list 0
“8”
8、根据下标删除元素
语法:ltrim key start stop
127.0.0.1:6379> ltrim list 1 2
OK
127.0.0.1:6379> lrange list 0 -1
"5"
"4"
"8"
三、内部实现
早期的列表类型使用的是ziplist(压缩列表)和双向链表组成的,Redis 3.2改为用 quicklist来存储列表元素。
quicklist是一个双向链表,链表中的每个节点实际上是一个ziplist,ziplist本质是一个字节数组。
quicklist添加操作对应函数是quicklistPush,先判断quicklist的head节点是否可以插入数据,如果可以插入则使用ziplist的接口进行插入,否则就新建quicklistNode节点进行插入。函数的返回值为int,0表示没有新建head,1表示新建了head。
quicklist单一元素删除对应函数是quicklistDelEntry,区间元素删除对应函数是quicklistDelRange。quicklist在区间删除时,会先找到start所在的quicklistNode,计算删除的元素是否小于要删除的count,如果不满足删除的个数,则会移动至下一个quicklistNode继续删除,依次循环直到删除完成为止,quicklistDelRange函数的返回值为int,返回1表示成功删除指定区间的元素,返回 0表示没有删除任何元素。
四、应用场景
1、消息队列
列表类型可以使用rpush实现先进先出的功能,同时又可以使用lpop轻松的弹出(查询并删除)第一个元素,所以列表类型可以用来实现消息队列;
2、文章列表
对于博客站点来说,当用户和文章都越来越多时,为了加快程序的响应速度,我们可以把用户自己的文章存入到List中,因为List是有序的结构,这样可以完美的实现分页功能,从而加速程序的响应速度。