当前位置: 首页 > news >正文

【Redis篇】 List 列表

在 Redis 中,List 是一种非常常见的数据类型,用于表示一个有序的字符串集合。与传统的链表结构类似,Redis 的 List 支持在两端进行高效的插入和删除操作,因此非常适合实现队列(Queue)和栈(Stack)等数据结构。

Redis List 的基本概念

  • 有序的字符串集合List中的元素按插入顺序排列,每个元素都是一个字符串。
  • 双端队列:Redis List 是一个双端队列(Deque),允许你在列表的两端高效地进行操作(插入和删除)。
  • 最大长度:Redis 的 List 数据类型没有最大长度限制,理论上可以存储无限多的元素,除非内存不足。

List命令:

LPUSH

LPUSH 命令用于将一个或多个元素插入到列表的头部(即左侧)。如果列表不存在,Redis 会自动创建一个空列表并执行插入操作。

语法: LPUSH key value [value ...]
 

127.0.0.1:6379> lpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange key 0 -1
1) "4"
2) "3"
3) "2"
4) "1"

返回值

  • 返回插入元素后的列表长度。

LPUSHX 

LPUSHX 是一个用于将元素推入到列表(list)头部的命令,但与 LPUSH 不同的是,LPUSHX 只有在列表已存在的情况下才会执行操作。如果列表不存在,LPUSHX 不会做任何操作,也不会创建新的列表。 

语法:LPUSHX key value

127.0.0.1:6379> lpush key world
(integer) 1
127.0.0.1:6379> lpushx key hello 
(integer) 2
127.0.0.1:6379> lpushx key2 hi 
(integer) 0
127.0.0.1:6379> lrange key 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> lrange key2 0 -1
(empty array)

总结:

LPUSHX 用于将元素添加到已经存在的列表中,它不会创建新的列表,这与 LPUSH(无论列表是否存在都创建新列表)有所不同。

 RPUSH

RPUSH 命令用于将一个或多个元素插入到列表的尾部(即右侧)。如果列表不存在,Redis 会自动创建一个空列表并执行插入操作。

语法:RPUSH key value [value ...]
 

127.0.0.1:6379> rpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> rpush key 5 6 7 8
(integer) 8
127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"

返回值:

  • 返回插入元素后的列表长度。

RPUSHX 同理 LPUSHX

LRANGE

LRANGE 命令用于获取列表中的一个指定范围的元素。你可以指定开始和结束的索引位置,然后 Redis 会返回该范围内的所有元素。

语法:LRANGE key start stop

127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
127.0.0.1:6379> lrange key 0 3
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> lrange key 0 100
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
127.0.0.1:6379> lrange key 8 10
(empty array)
127.0.0.1:6379> lrange key -8 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"

返回值:

  • 返回指定范围内的所有元素。如果范围超出列表长度,Redis 会返回所有符合范围条件的元素。

总结:

  • LRANGE 用于获取 Redis 列表中指定范围的元素。
  • 支持负数索引,可以从列表尾部获取元素。
  • 如果 start 和 stop 超出了列表的实际长度,Redis 会自动调整范围。

LPOP

LPOP 命令用于从列表的头部(左侧)移除并返回一个元素。执行该命令时,列表的第一个元素会被移除,并返回这个被移除的元素。如果列表为空,LPOP 会返回 nil

语法:LPOP key

127.0.0.1:6379> rpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> lpop key
"1"
127.0.0.1:6379> lpop key
"2"
127.0.0.1:6379> lpop key
"3"
127.0.0.1:6379> lpop key
"4"
127.0.0.1:6379> lpop key
(nil)

返回值:

  • 返回被移除的列表元素。
  • 如果列表为空,返回 nil

总结:

LPOP 是一个用于从 Redis 列表左侧移除并返回一个元素的命令。如果列表为空,返回 nil

RPOP 同理 
 RPOP 命令用于从列表的尾部(右侧)移除并返回一个元素。执行该命令时,列表的最后一个元素会被移除,并返回该元素。如果列表为空,RPOP 会返回 nil

LINDEX

LINDEX 命令用于获取列表中指定位置的元素。你可以通过指定一个索引来获取列表中对应位置的元素。

语法:LINDEX key index

127.0.0.1:6379> rpush key 1 2 3 4 5 6 7 8
(integer) 8
127.0.0.1:6379> lindex key 0
"1"
127.0.0.1:6379> lindex key 7
"8"
127.0.0.1:6379> lindex -1
127.0.0.1:6379> lindex key -1
"8"
127.0.0.1:6379> lindex key -7
"2"
127.0.0.1:6379> lindex key 9
(nil)

返回值:

        返回指定位置的元素。

        如果指定的索引超出了列表的范围,返回 nil

总结:

LINDEX 用于获取 Redis 列表中指定位置的元素。可以通过正数索引或负数索引来指定位置。如果索引超出范围,返回 nil。这是一个读取操作,而不会改变列表内容

 

LINSERT

LINSERT 命令用于在列表中指定位置插入一个元素。你可以在列表的 左侧 或 右侧 插入元素,依据你指定的插入位置。
语法:LINSERT key BEFORE|AFTER pivot element
 

127.0.0.1:6379> rpush key a b c d
(integer) 4
127.0.0.1:6379> linsert key before b 111
(integer) 5
127.0.0.1:6379> linsert key after b 222
(integer) 6
27.0.0.1:6379> linsert key before e 333
(integer) -1
127.0.0.1:6379> lrange key 0 -1
1) "a"
2) "111"
3) "b"
4) "222"
5) "c"
6) "d"

返回值:

        如果操作成功,返回列表的新长度。

        如果 pivot 元素在列表中不存在,则不插入任何元素,返回 -1

总结:

LINSERT 命令在 Redis 列表中指定位置插入一个新元素。可以在指定元素的 前 或 后 插入。它是一个修改列表的命令,成功执行后返回新的列表长度,如果指定的 pivot 元素不存在,则返回 -1

 LLEN

LLEN 命令用于获取列表的长度,即列表中元素的数量。

语法:LLEN key
 

127.0.0.1:6379> lrange key 0 -1
1) "a"
2) "111"
3) "b"
4) "222"
5) "c"
6) "d"
127.0.0.1:6379> llen key
(integer) 6
127.0.0.1:6379> llen key2
(integer) 0

返回值:

返回列表中元素的数量。如果该 key 对应的不是一个列表,或者该列表为空,返回 0

如果 key 不存在,返回 0

总结:

LLEN 命令用于获取 Redis 列表的长度,返回列表中元素的数量。如果列表为空或不存在,返回 0

 阻塞版本命令

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

图 2-22 阻塞版本的 blpop 和 非阻塞版本 lpop 的区别

演示一下BLPOP

BLPOP 命令是 阻塞式弹出(Blocking Pop)命令,它用于从一个或多个列表中弹出一个元素。如果列表为空,命令会阻塞,直到有元素可弹出为止,或者超时。

语法:BLPOP key [key ...] timeout

此时再开一个服务器去增加key里面的元素

此时发现它在100内只有接收到key中是否有信息即可

返回值:

        如果成功弹出了元素,返回一个列表,包含两个元素:

        第一个元素是列表名称 key

        第二个元素是从该列表中弹出的值。

        如果在 timeout 时间内没有元素可弹出,命令返回 nil

总结:

BLPOP 是 Redis 中的阻塞式弹出命令,可以从一个或多个列表中弹出元素。它会阻塞直到列表中有元素可供弹出,或者超时。如果超时,命令返回 nil。此命令常用于任务队列或消息队列的实现。

 BRPOP同理BLPOP

List使用场景

消息队列

Redis 可以使用 lpush + brpop 命令组合实现经典的阻塞式生产者-消费者模型队列
生产者客户端使用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式地从队列中 "争抢" 队首元素。通过多个客户端来保证消费的负载均衡和高可用性。
 

结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!  

相关文章:

【Redis篇】 List 列表

在 Redis 中,List 是一种非常常见的数据类型,用于表示一个有序的字符串集合。与传统的链表结构类似,Redis 的 List 支持在两端进行高效的插入和删除操作,因此非常适合实现队列(Queue)和栈(Stack…...

多级IIR滤波效果(BIQUAD),system verilog验证

MATLAB生成IIR系数 采用率1k,截止频率30hz,Matlab生成6阶对应的biquad3级系数 Verilog测试代码 // fs1khz,fc30hz initial beginreal Sig_Orig, Noise_white, Mix_sig;real fs 1000;Int T 1; //周期int N T*fs; //1s的采样点数// 数组声明…...

【WPF中ControlTemplate 与 DataTemplate之间的区别?】

前言 WPF中ControlTemplate 与 DataTemplate之间的区别? 1. 定义: ControlTemplate 是用于定义 WPF 控件的外观和结构的模板。它允许您重新定义控件的视觉表现,而不改变控件的行为。 DataTemplate 是用于定义如何呈现数据对象的模板。它通…...

Keil5配色方案修改为类似VSCode配色

1. 为什么修改Keil5配色方案 视觉习惯:如果你已经习惯了VSCode的配色方案,尤其是在使用ESP-IDF开发ESP32时,Keil5的默认配色可能会让你感到不习惯。减少视觉疲劳:Keil5的默认背景可能过于明亮,长时间使用可能会导致视…...

ndp协议简介

在IPv6中,ARP(地址解析协议)被替代为邻居发现协议(Neighbor Discovery Protocol,NDP)。NDP是IPv6网络中用于发现邻居节点(相邻设备)的协议,类似于IPv4中的ARP。但与ARP不…...

stable diffusion实践操作-大模型介绍:SD的发展历史,SD1.5和SDXL之间的差别

大家有没有这样的困惑:在找模型时,老是会出现一些奇怪的标签,像 sd1.5、sdxl 之类的模型后缀,真让人摸不着头脑,一会儿 1.0,一会儿 1.5,一会儿 XL,完全搞不清楚状况。今天就来给大家…...

系统无法运行提示:sqlsut.dll初始化错误怎么解决?多种解决方法汇总一览

遇到 sqlsut.dll 初始化错误,这通常意味着 SQL Server 的某些组件未能正确加载或初始化。以下是一些可能的解决方法汇总,旨在帮助您排查和解决问题: 解决方法 1. 检查SQL Server服务状态•确认所有相关的SQL Server服务(如SQL Se…...

通过waitress启动flask应用

假设你有一个名为 app.py 的文件,app 是指你的 Flask 应用实例。并且在这个文件中创建了一个 Flask 应用实例,那么你可以这样导入和使用它。 示例结构 假设你的项目结构如下: my_flask_app/ │ ├── app.py ├── waitress_server.py └─…...

Redis高阶之容错切换

当一台主机master宕掉之后,他的从机会取代主机么? 查看集群状态 127.0.0.1:6385> cluster nodes c8ff33e8da5fd8ef821c65974dda304d2e3327f9 192.168.58.129:638216382 slave f6b1fd5e58df90782f602b484c2011d52fc3482d 0 1733220836918 1 connecte…...

蓝桥杯准备训练(lesson2 ,c++)

3.1 字符型 char //character的缩写在键盘上可以敲出各种字符,如: a , q , , # 等,这些符号都被称为字符,字符是⽤单引号括 起来的,如: ‘a’ , ‘b’ &…...

【力扣】2094.找出3为偶数

思路 方法一:使用Set集合 1.首先是三层for循环,遍历,并且遇到不满足的情况,便跳过,继续计算。不如前导为0,以及遍历同一个数组下标的情况 2.使用Set集合来确保答案是唯一的,使用桶来标记也是可以的 3.但是…...

利用红黑树封装map,和set,实现主要功能

如果不知道红黑树是什么的时候可以去看看这个红黑树 思路 首先我们可以把封装分为两个层面理解,上层代码就是set,和map,底层就是红黑树 就相当于根据红黑树上面套了两个map,set的壳子,像下面这张图一样 对于map和set,map里面存…...

网络(TCP)

目录 TCP socket API 详解 套接字有哪些类型?socket有哪些类型? 图解TCP四次握手断开连接 图解TCP数据报结构以及三次握手(非常详细) socket缓冲区以及阻塞模式详解 再谈UDP和TCP bind(): 我们的程序中对myaddr参数是这样…...

CSS 选择器的优先级

一、基本概念 CSS 选择器的优先级决定了在样式冲突时,哪个样式规则将被应用到 HTML 元素上。通过理解 CSS 选择器的优先级,可以更好地控制网页元素的样式,避免样式冲突。 二、优先级计算规则 1. 内联样式 内联样式具有最高的优先级。 &l…...

留学生数学辅导作业随机过程高等线性代数概率论微积分优化统计

针对留学生数学辅导作业中的随机过程、高等线性代数、概率论、微积分、优化以及统计等科目,以下是一些详细的辅导建议和资源概述: 一、随机过程 概念理解: 随机过程是研究随机现象随时间演变的数学分支。它涉及概率论和数理统计的知识&#…...

移动机器人课程建图实验-ROSbug汇总

问题1描述 $ rosrun robot_state_publisher robot_state_publisher [ERROR] [1733131886.474757207]: [registerPublisher] Failed to contact master at [localhost:11311]. Retrying...解决方案 这个错误信息表明 robot_state_publisher 节点无法联系到 ROS master。通常&…...

小家电出海,沃丰科技助力保障售后服务的及时性与高效性

随着全球化步伐的加快,小家电行业也逐渐迈向国际市场,面向全球消费者提供服务。然而,跨国界的销售和服务挑战也随之而来,尤其是售后服务的及时性与高效性成为了企业亟需解决的问题。沃丰科技凭借其全渠道在线客服、工单系统和视频…...

vscode 如何支持点击跳转函数,以C++为例,Python等其它编程语言同理,Visual Studio Code。

VScode(Visual Studio Code)按住Ctrl鼠标左键,没法跳转到对应的函数怎么办。 如下图所示 1、点击有四个小方块的图标 2、输入C(如果你的编程语言是C,其它的就输其它的) 3、找到C Extension(其它编程语言&#xff0…...

创建子类对象时,会创建父类对象吗

一、查询网上的结论: 创建子类对象时, 会先调用子类构造方法对子类对象进行初始化,子类构造方法的第一行又会调用父类构造方法对父类进行初始化(不会创建父类对象, 但是会在子类对象的内存空间中开辟一块被包含的内存空间存储父类…...

华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数

华为交换机WEB操作 使用的是真机S5735,目前主流的版本都适用(V1R5~V2R1的就不在列了,版本太老了,界面完全不一样,这里调试线接的console口,电脑的网络接在ETH口) 「模拟器、工具合集」复制整段内…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾&#xff1a; 在上一篇《React核心概念&#xff1a;State是什么&#xff1f;》中&#xff0c;我们学习了如何使用useState让一个组件拥有自己的内部数据&#xff08;State&#xff09;&#xff0c;并通过一个计数器案例&#xff0c;实现了组件的自我更新。这很棒&#…...