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结合了两者的优点,使用链表但是链表的节点是压缩列表。

相关推荐
此生只爱蛋8 小时前
【Redis】主从复制
数据库·redis
惊讶的猫13 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
期待のcode13 小时前
Redis的主从复制与集群
运维·服务器·redis
jiunian_cn13 小时前
【Redis】渐进式遍历
数据库·redis·缓存
SoleMotive.14 小时前
谢飞机爆笑面经:Java大厂3轮12问真题拆解(Redis穿透/Kafka分区/MCP Agent)
redis·spring cloud·kafka·java面试·mcp
椰子今天很可爱14 小时前
Redis进阶
redis
jiunian_cn14 小时前
【Redis】数据库管理操作
数据库·redis·缓存
惊讶的猫15 小时前
Redis 哨兵(Sentinel)介绍
redis·redis哨兵
猫头虎15 小时前
基于信创openEuler系统安装部署OpenTeleDB开源数据库的实战教程
数据库·redis·sql·mysql·开源·nosql·database
静听山水15 小时前
Redis核心数据结构-ZSet
数据结构·redis