详解Redis的List类型及相关命令

devtools/2025/1/24 2:54:25/

目录

LPUSH

LPUSHX

RPUSH

RPUSHX

LRANGE

LPOP

RPOP

LINDEX

LINSERT

LLEN

阻塞版本命令

BLPOP

BRPOP

内部编码

应用场景


Redis中的List类型,是保证元素有序的,支持队列从两端进行插入删除和获取,并且元素时刻重复的。

LPUSH
将⼀个或者多个元素从左侧放⼊(头插)到 list 中。

语法

LPUSH key element [element ...]
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.
返回值:插⼊后 list 的⻓度。
举例
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
LPUSHX
在 key 存在时,将⼀个或者多个元素从左侧放⼊(头插)到 list 中。不存在,直接返回。

语法

LPUSHX key element [element ...]
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.
返回值:插⼊后 list 的⻓度。
举例
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSHX mylist "Hello"
(integer) 2
redis> LPUSHX myotherlist "Hello"
(integer) 0
redis> LRANGE mylist 0 -1
1) "Hello"
2) "World"
redis> LRANGE myotherlist 0 -1
(empty array)
RPUSH
将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。
语法
RPUSH key element [element ...]
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.
返回值:插⼊后 list 的⻓度。
举例
redis> RPUSH mylist "hello"
(integer) 1
redis> RPUSH mylist "world"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
RPUSHX
在 key 存在时,将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。

语法

RPUSHX key element [element ...]
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.
返回值:插⼊后 list 的⻓度。
举例
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSHX mylist "World"
(integer) 2
redis> RPUSHX myotherlist "World"
(integer) 0
redis> LRANGE mylist 0 -1
1) "Hello"
2) "World"
redis> LRANGE myotherlist 0 -1
(empty array)
LRANGE
获取从 start 到 end 区间的所有元素,左闭右闭。
语法
LRANGE key start stop
时间复杂度:O(N)
返回值:指定区间的元素。
举例
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> LRANGE mylist 0 0
1) "one"
redis> LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist 5 10
(empty array)
LPOP
从 list 左侧取出元素(即头删)。
语法
LPOP key
时间复杂度:O(1)
返回值:取出的元素或者 nil。
举例
redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> LPOP mylist
"one"
redis> LPOP mylist 2
1) "two"
2) "three"
redis> LRANGE mylist 0 -1
1) "four"
2) "five"
RPOP
从 list 右侧取出元素(即尾删)。
语法
RPOP key
时间复杂度:O(1)
返回值:取出的元素或者 nil。
举例
redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> RPOP mylist
"five"
redis> RPOP mylist 2
1) "four"
2) "three"
redis> LRANGE mylist 0 -1
1) "one"
2) "two"
LINDEX
获取从左数第 index 位置的元素。

语法

LINDEX key index

时间复杂度:O(N)
返回值:取出的元素或者 nil。

举例

redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3
(nil)
LINSERT
在特定位置插⼊元素。

语法

LINSERT key <BEFORE | AFTER> pivot element
时间复杂度:O(N)
返回值:插⼊后的 list ⻓度。
举例
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
LLEN
获取 list ⻓度。

语法

LLEN key
时间复杂度:O(1)
返回值:list 的⻓度。
举例
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LLEN mylist
(integer) 2
阻塞版本命令

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应⾮阻塞版本的作⽤基本⼀致,除了:
• 在列表中有元素的情况下,阻塞和⾮阻塞表现是⼀致的。但如果列表中没有元素,⾮阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 Redis 可以执⾏其他命令,但要求执⾏该命令的客⼾端会表现为阻塞状态。
• 命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有⼀个键对应的列表中可以弹出元素,命令⽴即返回。
• 如果多个客⼾端同时多⼀个键执⾏ pop,则最先执⾏命令的客⼾端会得到弹出的元素。

BLPOP
LPOP 的阻塞版本。

语法

BLPOP key [key ...] timeout
时间复杂度:O(1)
返回值:取出的元素或者 nil。
举例
redis> DEL list1 list2
(integer) 0
redis> RPUSH list1 a b c
(integer) 3
redis> BLPOP list1 list2 0
1) "list1"
2) "a"
BRPOP
RPOP 的阻塞版本。

语法

BRPOP key [key ...] timeout
时间复杂度:O(1)
返回值:取出的元素或者 nil。
举例
redis> DEL list1 list2
(integer) 0
redis> RPUSH list1 a b c
(integer) 3
redis> BRPOP list1 list2 0
1) "list1"
2) "c"
内部编码

列表类型的内部编码有两种:

• ziplist(压缩列表):当列表的元素个数⼩于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的⻓度都⼩于 list-max-ziplist-value 配置(默认 64 字节)时,Redis 会选⽤ziplist 来作为列表的内部编码实现来减少内存消耗。
• linkedlist(链表):当列表类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ linkedlist 作为列表的内部实现。

1)当元素个数较少且没有⼤元素时,内部编码为 ziplist:

127.0.0.1:6379> rpush listkey e1 e2 e3
OK
127.0.0.1:6379> object encoding listkey
"ziplist"

2)当元素个数超过 512 时,内部编码为 linkedlist:

127.0.0.1:6379> rpush listkey e1 e2 e3 ... 省略 e512 e513
OK
127.0.0.1:6379> object encoding listkey
"linkedlist"

3)当某个元素的⻓度超过 64 字节时,内部编码为 linkedlist:

127.0.0.1:6379> rpush listkey "one string is bigger than 64 bytes ... 省略 ..."
OK
127.0.0.1:6379> object encoding listkey
"linkedlist"

应用场景

1.消息队列

List类型可以用作一个先进先出(FIFO)的消息队列。生产者将消息添加到列表的右端(尾部),而消费者则从列表的左端(头部)读取消息。这种机制非常适合在生产者和消费者之间传递消息,实现异步通信。

2.数据分页

在处理大量数据时,可以使用List类型来实现数据的分页显示。将数据按照某种顺序存储在列表中,然后根据页码和每页显示的数据量来获取相应的数据子集。这种方法在处理需要分页显示的长列表时非常有效。

3.延时任务

List类型可以用于存储延时任务,如发送电子邮件、短信通知等。将任务添加到列表中,并使用定时任务系统(如Redis的键空间通知或外部定时任务调度器)检查列表中的任务,并在适当的时间执行它们。


http://www.ppmy.cn/devtools/153023.html

相关文章

【2025小年源码免费送】

&#x1f496;学习知识需费心&#xff0c; &#x1f4d5;整理归纳更费神。 &#x1f389;源码免费人人喜&#xff0c; &#x1f525;码农福利等你领&#xff01; &#x1f496;山高路远坑又深&#xff0c; &#x1f4d5;大军纵横任驰奔&#xff0c; &#x1f389;谁敢横刀立马行…

头歌实训作业 算法设计与分析-贪心算法(第2关:最优装载问题)

任务描述 有一批集装箱要装上一艘载重量为C的轮船&#xff0c;共有n个集装箱&#xff0c;其中集装箱i的重量为Wi。 最优装载问题要求确定在装载体积不受限制的情况下&#xff0c;将尽可能多的集装箱装上轮船。 测试说明 输入和输出说明&#xff1a; 第1行为集装箱数目n和载重限…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Lin…

3.2 OpenAI 语言模型总览:GPT 系列的演进与应用解析

OpenAI 语言模型总览:GPT 系列的演进与应用解析 OpenAI 的语言模型,特别是 GPT(Generative Pre-trained Transformer)系列,代表了当前自然语言处理(NLP)技术的前沿。自从推出以来,这些模型不断推进了文本生成、理解和交互的能力,成为了多个应用场景中的核心技术。本文…

css3过渡总结

一、过渡的定义与作用 CSS3 过渡&#xff08;Transitions&#xff09;允许 CSS 属性在一定的时间区间内平滑地过渡&#xff0c;从一个值转变为另一个值。它能够让网页元素的状态变化更加自然、流畅&#xff0c;给用户带来更好的视觉体验。例如&#xff0c;当一个元素从隐藏状态…

vscode 自用插件

vscode按住ctrl鼠标左键无法跟踪跳转方法名&#xff0c;装这些插件就可以 vscode-elm-jump:常规的代码跳转定义 Vue CSS Peek:跳转css定义 vue-helper:变量函数只跳转定义 Vetur 代码提示 Baidu Comate 自动帮你写console.log Turbo Console Log: ctrl alt l 选中变量之后&am…

实战演示:利用ChatGPT高效撰写论文

在当今学术界&#xff0c;撰写论文是一项必不可少的技能。然而&#xff0c;许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是&#xff0c;人工智能的快速发展为我们提供了新的工具&#xff0c;其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

在VSCode中使用Jupyter Notebook

在VSCode中安裝Python和Jupyter擴展 在VSC中打开和使用 Jupyter Notebook 创建或打开 Notebook 文件&#xff1a;在 VSCode 中&#xff0c;使用命令面板&#xff08;CtrlShiftP 或 CmdShiftP&#xff09;输入 Jupyter: Create New Blank Notebook 来创建一个新的 Notebook&…