-
2.7 Redis中的list列表
-
Redis list(列表)相当于 Java 语言中的 LinkedList 结构,是一个链表而非数组,其插入、删除元素的时间复杂度为 O(1),但是查询速度欠佳,时间复杂度为 O(n)。
当向列表中添加元素值时,首先需要给这个列表指定一个 key 键,然后使用相应的命令,从列表的左侧(头部)或者右侧(尾部)来添加元素,这些元素会以添加时的顺序排列。一个列表最多可以包含 2^32 - 1 个元素(约 40 亿个元素),当列表弹出最后一个元素时,该结构会被自动删除。
Redis 列表的底层存储结构,其实是一个被称为快速链表(quicklist)的结构。当列表中存储的元素较少时,Redis 会使用一块连续的内存来存储这些元素,这个连续的结构被称为 ziplist(压缩列表),它将所有的元素紧挨着一起存储。
备注:压缩列表是 Redis 为节省内存而开发的,它是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表了可以包含任意多个节点,每个节点都可以保存一个字符数组或者整数值。
而当数据量较大时,Redis 列表就会是用 quicklist(快速链表)存储元素。Redis 之所以采用两种方法相结合的方式来存储元素。这是因为单独使用普通链表存储元素时,所需的空间较大,会造成存储空间的浪费。因此采用了链表和压缩列表相结合的方式,也就是 quicklist + ziplist,结构如下图:
图1:快速链表
如上图 1 所示,将多个 ziplist 使用双向指针串联起来,这样既能满足快速插入、删除的特性,又节省了一部分存储空间。
基本命令演示
下面学习如何使用命令操作 Redis 列表。以下示例演示了如何从列表的左侧、右侧添加和弹出元素。
#从左侧头部插入元素 127.0.0.1:6379> LPUSH www.duidaima.com python (integer) 1 127.0.0.1:6379> LPUSH www.duidaima.com java c c# (integer) 4 #查看插入的元素 127.0.0.1:6379> LRANGE www.duidaima.com 0 4 1) "c#" 2) "c" 3) "java" 4) "python" #从右侧尾部插入元素 127.0.0.1:6379> RPUSH www.duidaima.com "Math" (integer) 5 127.0.0.1:6379> RPUSH www.duidaima.com "Computer Language" (integer) 6 #查看元素 127.0.0.1:6379> LRANGE www.duidaima.com 0 6 1) "c#" 2) "c" 3) "java" 4) "python" 5) "Math" 6) "Computer Language" #在python前面插入元素 127.0.0.1:6379> LINSERT www.duidaima.com BEFORE python Python (integer) 7 #从左侧弹出元素 127.0.0.1:6379> LPOP www.duidaima.com "c#" #从右侧弹出元素 127.0.0.1:6379> RPOP www.duidaima.com "Computer Language"
队列和栈实现
Redis 列表可以被当做栈、队列来使用,如果列表的元素是“左进右出”那就是队列模型;如果元素是“右进右出”那就是栈模型,示例如下:
1) 右进左出
127.0.0.1:6379> Rpush book c python java (integer) 3 127.0.0.1:6379> lpop book "c" 127.0.0.1:6379> lpop book "python" 127.0.0.1:6379> lpop book "java" 127.0.0.1:6379> lpop book (nil)
2) 右进右出
127.0.0.1:6379> RPUSH book c python java (integer) 3 127.0.0.1:6379> rpop book "java" 127.0.0.1:6379> rpop book "python" 127.0.0.1:6379> rpop book "c" 127.0.0.1:6379> rpop book (nil)
除上述模型外,Redis 的列表也常被用作异步队列。使用流程大致如下:一个线程将需要延时处理的任务序列化成字符串,并“塞”进 Redis 列表中,而另外一个线程则以轮询的方式从该列表中读取“任务”。
常用命令
list类型常用命令
在线练习工具:https://try.redis.io/
查看更多命令:https://redis.io/commands
- 留下你的读书笔记
- 你还没登录,点击这里
-
用户笔记留言