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

相关推荐
IT大白鼠4 天前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz4 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
lbb 小魔仙4 天前
OpenClaw + cpolar 实战:远程 NAS、分享小游戏、RDP,再配置公网 AI 入口
数据库·人工智能·redis·oracle·prometheus
夕除4 天前
redis--018
redis
两锭子4 天前
Redis基础
redis
烟沙九洲4 天前
Redis 缓存穿透、缓存击穿、缓存雪崩
数据库·redis
字节探索5 天前
Redis 只会当缓存用?这 10 大实战场景,让你的系统快到飞起
redis·后端
于樱花森上飞舞5 天前
【Redis】哨兵详解
java·开发语言·数据库·redis
Rain的Java大神之路5 天前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
Wang's Blog5 天前
Java 接入Redis: 通用命令与键管理
java·服务器·redis