Redis中的List列表

list列表类型是用来存储多个有序的字符串。列表中的每个字符串称为元素,一个列表最多可以存储( 2 32 2^{32} 232-1)个元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定下标的元素等等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。

列表两端插入和弹出操作:

列表的获取、删除等操作:

命令

LPUSH

语法:

shell 复制代码
LPUSH key element [element ...]

功能:将一个或者多个元素头插到list中。

命令有效版本:1.0.0以后

时间复杂度:O(K),K为单次插入的元素个数

返回值:插入后list的长度。

演示:

shell 复制代码
127.0.0.1:6379> lpush key element
(integer) 1
127.0.0.1:6379> lpush key element2 element3 element4
(integer) 4
127.0.0.1:6379> lrange key 0 -1
1) "element4"
2) "element3"
3) "element2"
4) "element"
127.0.0.1:6379> 

LPUSHX

语法:

shell 复制代码
LPUSH key element [element ...]

功能:当key存在时,将一个或者多个元素头插到list中。不存在,直接返回。

命令有效版本:2.0.0以后

时间复杂度:O(K),K为单次插入的元素个数

返回值:插入后list的长度。

演示:

shell 复制代码
127.0.0.1:6379> lpush key element
(integer) 1
127.0.0.1:6379> lpushx key element1 element2
(integer) 3
127.0.0.1:6379> del key
(integer) 1
127.0.0.1:6379> lpushx key element3
(integer) 0
127.0.0.1:6379> 

RPUSH

语法:

shell 复制代码
RPUSH key element [element ...]

功能:将一个或者多个元素尾插到list中

命令有效版本:1.0.0以后

时间复杂度:O(K),K为单次插入的元素个数

返回值:插入后list的长度。

演示:

shell 复制代码
127.0.0.1:6379> rpush key element1 element2 element3
(integer) 3
127.0.0.1:6379> lrange key 0 -1
1) "element1"
2) "element2"
3) "element3"
127.0.0.1:6379> 

RPUSHX

语法:当key存在时,将一个或者多个元素尾插到list中。不存在,直接返回。

shell 复制代码
RPUSHX key element [element ...]

功能:

命令有效版本:2.0.0以后

时间复杂度:O(K),K为单次插入的元素个数

返回值:插入后list的长度。

演示:

shell 复制代码
127.0.0.1:6379> rpushx key 1 2 3
(integer) 0
127.0.0.1:6379> rpush key 1 2 3
(integer) 3
127.0.0.1:6379> rpushx key 4 5 6
(integer) 6
127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> 

LRANGE

语法:

shell 复制代码
LRANGE key start stop

功能:获取从start到end区间的所有元素,左闭右闭。

命令有效版本:1.0.0以后

时间复杂度:O(N)

返回值:指定区间的元素

演示:

shell 复制代码
127.0.0.1:6379> lpush key element2 element3 element4
(integer) 3
127.0.0.1:6379> lpush key element5 element6 element7
(integer) 6
127.0.0.1:6379> lrange key 0 -1
1) "element7"
2) "element6"
3) "element5"
4) "element4"
5) "element3"
6) "element2"
127.0.0.1:6379> lrange key 1 2
7) "element6"
8) "element5"
127.0.0.1:6379> lrange key 0 100
9) "element7"
10) "element6"
11) "element5"
12) "element4"
13) "element3"
14) "element2"
127.0.0.1:6379> 

注意:如果指定区间超过了合法区域,lrange仍然会返回指定区间内合法的区域。

LPOP

语法:

shell 复制代码
LPOP key

功能:从list左侧取出元素,头删。

命令有效版本:1.0.0以后

时间复杂度:O(1)

返回值:取出的元素或是nil

演示:

shell 复制代码
127.0.0.1:6379> lpush key 1 2 3 4 5 6 
(integer) 6
127.0.0.1:6379> lrange key 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> lpop key
"6"
127.0.0.1:6379> lpop key
"5"
127.0.0.1:6379> lrange key 0 -1
7) "4"
8) "3"
9) "2"
10) "1"
127.0.0.1:6379> 

RPOP

语法:

shell 复制代码
RPOP key

功能:从list右侧取出元素,尾删。

命令有效版本:1.0.0以后

时间复杂度:O(1)

返回值:取出的元素或是nil

演示:

shell 复制代码
127.0.0.1:6379> lpush key 1 2 3
(integer) 3
127.0.0.1:6379> rpop key
"1"
127.0.0.1:6379> rpop key
"2"
127.0.0.1:6379> rpop key
"3"
127.0.0.1:6379> rpop key
(nil)
127.0.0.1:6379> 

LINDEX

语法:

shell 复制代码
LINDEX key index

功能:获取从左数第index位置的元素

命令有效版本:1.0.0以后

时间复杂度:O(N)

返回值:取出的元素或者nil

演示:

shell 复制代码
127.0.0.1:6379> lpush key 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lindex key 0
"5"
127.0.0.1:6379> lrange key 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lindex key -1
"1"
127.0.0.1:6379> lindex key 100
(nil)
127.0.0.1:6379> 

LINSERT

语法:

shell 复制代码
LINSERT key <BEFORE | AFTER> pivot element

功能:在特定位置插入元素。

命令有效版本:1.0.0以后

时间复杂度:O(N)

返回值:插入后的list元素

演示:

shell 复制代码
127.0.0.1:6379> lpush key 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange key 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> linsert key before 5 100
(integer) 6
127.0.0.1:6379> lrange key 0 -1
6) "100"
7) "5"
8) "4"
9) "3"
10) "2"
11) "1"
127.0.0.1:6379> linsert key after 1 999
(integer) 7
127.0.0.1:6379> lrange key 0 -1
12) "100"
13) "5"
14) "4"
15) "3"
16) "2"
17) "1"
18) "999"
127.0.0.1:6379> 

LLEN

语法:

shell 复制代码
LLEN key

功能:获取list长度

命令有效版本:1.0.0以后

时间复杂度:O(1)

返回值:list的长度

演示:

shell 复制代码
127.0.0.1:6379> lpush key 1 2 3 4 5
(integer) 5
127.0.0.1:6379> llen key
(integer) 5
127.0.0.1:6379> llen key2
(integer) 0
127.0.0.1:6379> 

阻塞版本的命令

blpop和brpop是lpop和rpop的阻塞版本,和对应非阻塞版本的作用基本一致,除了:

  • 在列表中有元素的情况下,阻塞和非阻塞表现是一致的。但是如果列表中没有元素,非阻塞版本会立即返回nil。但是阻塞版本会根据timeout,阻塞一段时间,期间Redis可以执行其他命令,但是要求执行该命令的客户端会表现为阻塞状态。

  • 命令中如果设置了多个键,那么会从左向右进行遍历键,一旦有一个键对应的列表中可以弹出元素,命令立即返回。

  • 如果多个客户端同时对一个键执行阻塞pop,则最先执行命令的客户端会得到弹出的元素。

BLPOP

语法:

shell 复制代码
BLPOP key [key ...] timeout

功能:LPOP的阻塞版本。

命令有效版本:1.0.0以后。

时间复杂度:O(1)

返回的值:取出的元素或者nil

演示:

启动两个客户端

语法:

shell 复制代码
RLPOP key [key ...] timeout

功能:RPOP的阻塞版本。

命令有效版本:1.0.0以后。

时间复杂度:O(1)

返回的值:取出的元素或者nil

演示:

基本等同于BLPOP

内部编码

  • ziplist(压缩列表)

    • 当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中的每个元素的长度都小于list-max-ziplist-value配置(默认64个)时,Redis会选用ziplis来作为列表的内部实现来减少内存消耗。
  • linklist(链表)

    • 当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。

注意:在5.0版本以及列表的内部编码统一为了quicklist。

quicklist结合了两者的优点,使用链表但是链表的节点是压缩列表。

相关推荐
大猫子的技术日记11 小时前
Redis 快速上手:5 分钟掌握核心能力
数据结构·数据库·redis·缓存·持久化·pub/sub
panzer_maus11 小时前
Redis介绍(4)-认识Redis的事务
数据库·redis·缓存
徐同保11 小时前
OnlyOffice HTTPS 代理配置总结
redis·网络协议·https
javajingling11 小时前
redis命令
数据库·redis·缓存
一条大祥脚12 小时前
26.1.21 根号分治 相向双指针
java·开发语言·redis
像少年啦飞驰点、12 小时前
Java大厂面试真题:Spring Boot + Kafka + Redis 在电商场景下的实战应用
java·spring boot·redis·分布式·kafka·面试题·电商秒杀
ITUnicorn12 小时前
【Vue2+SpringBoot在线商城】13-本项目运用到的技术
java·spring boot·redis·后端
无心水13 小时前
8、吃透Go语言container包:链表(List)与环(Ring)的核心原理+避坑指南
java·开发语言·链表·微服务·架构·golang·list
wWYy.13 小时前
详解redis(6):数据结构string、list
数据库·redis·缓存
小北方城市网13 小时前
MyBatis 进阶实战:插件开发与性能优化
数据库·redis·python·elasticsearch·缓存·性能优化·mybatis