《Redis核心原理与实战》学习笔记5——列表使用与内部实现原理

一、简介

列表类型 (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是有序的结构,这样可以完美的实现分页功能,从而加速程序的响应速度。

原文地址:https://www.cnblogs.com/luckyliulin/p/13593775.html