Redis常用命令——List篇

 

    提到List,我们第一时间想到的就是链表。但是在Redis中,List更像是一种双端队列,例如C++中的deque。它可以快速高效的对头部和尾部进行插入和删除操作。本片文章主要对List列表的相关命令进行详解,希望本篇文章会对你有所帮助。

文章目录

一、List简介

二、相关命令

LPUSH

LRANGE

LPUSHX

RPUSH 和 RPUSHX

LPOP 和 RPOP

LINDEX

LINSER

LLEN

LREM

LTRIM

LSET

BLPOP 和 BRPOP

三、小结


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:Redis 👀

💥 标题:Redis常用命令——List篇💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️

一、List简介

  列表类型是用来存储多个有序的字符串,如下图所示,a、b、c、 d、e五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element) ,一个列表最多可以存储2^32-1个元素。在Redis 中,可以对列表两端插入(push)和弹出 (pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。

  Redis中的List还是有别于其他的链表的,其特点如下:

  • 列表中的元素是有序的,这意味着可以通过索引下标获取某个元素或者某个范围的元素列表,例如要获取上图的第5个元素,可以执行lindex user:1:messages 4或者倒数第1个元素,lindexuser:1:messages -1就可以得到元素e。
  • 区分获取和删除的区别,例如上图中的lrem 1 b是从列表中把从左数遇到的前1个b元素删除,这个操作会导致列表的长度从5变成4;但是执行lindex 4只会获取元素,但列表长度是不会变化的。
  • 列表中的元素是允许重复的,例如列表中包含了两个 a 元素。

  注意:上述提到列表是有序的,这里的有序并非只的是大小的有序,而是指的相对顺序是有序的,也就是相对顺序改变了,那么该列表就与原列表不同了!

  提到列表中的元素可以重复,那么我们就应该想到Hash是不允许有重复的 field 的,同时我们在设置String时,其对应的key也是不可以重复的。

二、相关命令

LPUSH

  LPUSH命令是用于将一个或多个值插入到列表的头部。语法:

LPUSH key value [value ...]

  返回值为插入完成后,列表的长度。具体如下:

LRANGE

  LRANGE命令是用于获取列表中指定范围内的元素。语法:

LRANGE key start stop

  参数:

  • key: 列表的键名。
  • start: 起始索引,从0开始计数(包含该索引处的元素)。
  • stop: 结束索引,从0开始计数(包含该索引处的元素)。

  返回值: 指定范围内的元素构成的列表。注意:这里的索引可以为负数,其中-1为该链表的最后一个元素,我们也可以把 -1 看成 len - 1。具体我们看如下实例:

  其实这里有一个问题:假如我们给的索引查过了列表的范围,那么Redis还能够正确返回对应的值吗?我们看如下情况:

LPUSHX

  LPUSHX命令是用于将一个值插入到已存在的列表头部(左侧)。其用法与LPUSH一样,唯一差别就是如果该链表不存在,那么就插入失败。简单来说:若指定的key不存在,则LPUSHX命令不会进行任何操作,返回值为0。这与LPUSH命令的区别在于,LPUSH命令在key不存在时会创建一个空列表并执行插入操作。具体如下:

RPUSH 和 RPUSHX

  学完LPUSH 和 LPUSHX后,那么RPUSH 和 RPUSHX就相当容易了。LPUSH就是进行头插,RPUSH是尾插。其他两者的用发、语义等全部一样。这里就不再过多演示,大家可自行练习。

LPOP 和 RPOP

  LPOP是头删, RPOP是尾删。其语法格式:

LPOP key
RPOP key
  • LPOP和RPOP命令都是用于移除并返回列表的第一个或最后一个元素。
  • 如果列表不存在,这两个命令将返回nil。
  • 如果存在,那么返回所删除的元素。
  • 这两个命令的时间复杂度均为O(1),因此能够在常数时间内完成操作。
  • 通过使用LPOP和RPOP命令,可以方便地实现先进先出(FIFO)或者后进先出(LIFO)的数据结构。

  下面我们看一下具体实例:

LINDEX

  LINDEX命令用于获取列表中指定索引位置的元素。其基本语法为:

LINDEX key index

  其中,key是存储列表的键名,index是要获取元素的索引。索引从0开始,负数索引表示从列表末尾开始倒数。如果是非法下表,那么返回nil。具体实例如下:

  注意,此操作的时间复杂度为O(n),并不是O(1)。

LINSER

  LINSERT命令用于向列表中特定元素的前面或后面插入新元素。其语法如下:

LINSERT key BEFORE|AFTER pivot value

  其中,key是列表的键名,pivot是列表中的某个元素,value是要插入的新元素。BEFORE和AFTER是指定插入位置的关键词,表示在pivot元素之前或之后进行插入。其返回值为插入成功的列表的长度。具体如下:

LLEN

  LLEN命令用于返回列表键的长度的命令。语法:

LLEN key

  参数:

  • key: 要获取长度的列表键名。

  返回值:

  • 列表的长度,如果键不存在,则返回0。

  该命令较为简单,我们直接看实例:

LREM

  LREM命令是用于移除列表中与给定值相等的元素的命令。具体而言,它可以从列表中删除指定数量的与给定值相等的元素。其语法:

LREM key count value

  参数:

  • key: 要操作的列表键名。
  • count: 指定删除元素的数量,可以为正数、负数或零。
    • 当count为正数时,表示从列表头部开始向尾部搜索,并移除与value相等的元素,直到数量达到count为止。
    • 当count为负数时,表示从列表尾部开始向头部搜索,并移除与value相等的元素,直到数量达到count的绝对值为止。
    • 当count为零时,表示移除所有与value相等的元素。
  • value: 要移除的元素的值。

  返回值:

  • 被移除的元素数量。

  我们结合下述例子来理解一下。首先创建一个新的列表,其中包含的元素如下:

  

  然后我们从左往右删除3个1,具体如下:

  我们再次从右向左删除3个2,具体如下:

  最后我们删除所有的3,具体如下:

LTRIM

  LTRIM命令是用于修剪存储在列表(List)数据结构中的元素。该命令可以删除列表中指定范围以外的所有元素,并保留指定范围内的元素。语法:

LTRIM key start stop

  其中,key是要操作的列表的键名,start和stop是要保留的元素的起始索引和结束索引(包含在内)。索引从0开始,负数索引表示从列表末尾开始计算。具体如下:

LSET

 LSET命令用于设置列表(List)数据结构中指定索引位置的元素的值。该命令可以帮助你更新列表中任意位置的元素。 语法为:

LSET key index value

  其中,key是要操作的列表的键名,index是要设置的元素的索引位置,value是要设置的新值。我们来看一下实例:

  注意,该命令的时间复杂度为O(n)。

BLPOP 和 BRPOP

  BLPOP命令是用于阻塞式(Blocking)左端弹出操作的命令,它用于从一个或多个列表中取出最左边(头部)的元素,并返回该元素及其所属列表的键名。

  问题来了:什么是阻塞式弹出呢?当有至少一个列表包含元素时,BLPOP会立即弹出并返回最左边的元素和其所属列表的键名;如果所有给定的列表都为空,则BLPOP会阻塞等待直到超时时间为止。简单来说就是如果列表为空,那么就会阻塞,之后有元素后会再被唤醒!但阻塞版本会根据timeout,阻塞一段时间,期间Redis可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。其语法:

BLPOP key [key ...] timeout

  下面我们看一个实例:

  上述key对应的value链表为空,所以被阻塞了。当我们从另一个客服端向此插入后,就会立刻返回:

  那要是尝试获取多个列表的key呢? 多个key对应多个list,这多个list哪个有元素了,就会返回哪个元素。如果多个客户端同时多一个键执行pop,则最先执行命令的客户端会得到弹出的元素。具体看如下实例:

  从上述的返回值中我们就能能看出来是弹出的那个list的元素。实际上BRPOP和BLPOP是一样的,这里就不再过多解释!

三、小结

  有关列表的命令已经介绍完毕,下图是这些命令的作用和时间复杂度,可以用来做参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/20969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MedSegDiff-V2: Diffusion-Based Medical Image Segmentation with Transformer 论文总结

标题:MedSegDiff-V2: Diffusion-Based(基于扩散模型)Medical Image Segmentation(医学图像分割)with Transformer 论文(AAAI):https://ojs.aaai.org/index.php/AAAI/article/view/28…

【避坑全攻略】如何让私人的LLM拥有一个嗓子——ChatTTS

OpenAI 发布 GPT4o 之后,使得越来越多的人都开始幻想属于自己的AI“伴侣”,这最让人惊艳的就是他们出色的TTS技术。而在此之前,主流的开源TTS有 XTTS 2 和 Bark。而近日,一个名为 ChatTTS 文本转语音项目爆火出圈,引来…

.gitignore 文件

一.什么是 .gitignore 文件 在任何当前工作的 Git 仓库中,每个文件都是这样的: 追踪的(tracked)- 这些是 Git 所知道的所有文件或目录。这些是新添加(用 git add 添加)和提交(用 git commit 提…

汽美汽修店管理系统会员小程序的作用是什么

汽车后市场汽美汽修赛道同样存在着大量商家,连锁品牌店或个人小店等,门店扎堆且区域覆盖面积广,当然每天车来车往也有不少生意。 随着线上化程度加深和商家不断拓展市场的需要,传统运营模式可能难以满足现状,尤其是年…

Element - UI <el-table-column>多选数据提交后禁用已提交的多选框

1. 通过 selection-change"selectionChange" 将已选择的数据存入selectData数组中 <el-table :data"tableData" class"my-5" selection-change"selectionChange" > //多选框已选择的数据 const selectData ref([]); const sel…

HALCON-从入门到入门-图像格式的互相转换

1.废话 上次说到了图片的读取和写入到本地&#xff0c;这次说一下图片的格式相关。 位图和矢量图 photoshop处理出来的图片肯定叫做图片&#xff0c;那么coreDraw处理出来的图片是不是也叫图片。 之间就有区分&#xff0c;一种叫做位图&#xff0c;一种叫做矢量图 位图和矢…

AI大模型探索之路-实战篇13: 从对话到报告:打造能记录和分析的Agent智能数据分析平台

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

echarts 图表不显示的问题

是这样的&#xff0c;点击详情&#xff0c;再点击统计&#xff0c;切换的时候就不会显示echarts图表&#xff0c;刚开始使用的是next Tick&#xff0c;没有使用定时器&#xff0c;后来加上了定时器就实现了如下所示&#xff1a; 代码是如下 const chartContainer ref(null); …

【Text2SQL 论文】DBCopilot:将 NL 查询扩展到大规模数据库

论文&#xff1a;DBCopilot: Scaling Natural Language Querying to Massive Databases ⭐⭐⭐⭐ Code: DBCopilot | GitHub 一、论文速读 论文认为目前的 Text2SQL 研究大多只关注具有少量 table 的单个数据库上的查询&#xff0c;但在面对大规模数据库和数据仓库的查询时时却…

UML静态图-对象图

概述 静态图包含类图、对象图和包图的主要目的是在系统详细设计阶段&#xff0c;帮助系统设计人员以一种可视化的方式来理解系统的内部结构和代码结构&#xff0c;包括类的细节、类的属性和操作、类的依赖关系和调用关系、类的包和包的依赖关系。 对象图与类图之间的关系&…

Day46 动态规划part06

完全背包问题 完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件。先遍历物品还是先遍历背包以及遍历顺序 根据递推公式可知&#xff1a;每一个dp需要根据上方和左方的数据推出&#xff0c;只要保证数据左上方数据是递推出来的这种两个for循环的顺序就是可…

【python学习】Anaconda的介绍、下载及conda和pip换源方式(切换到国内镜像源)

什么是Anaconda Anaconda 是一个专为数据科学和机器学习预装了多种库的Python发行版。 提供了包管理与环境管理的功能解决了多个版本python并存的问题解决了第三方包安装问题 如何下载Anaconda 官网地址&#xff1a;https://www.anaconda.com/ 点击右上角的 Free Download …

C语言王国——选择与循环(1)

目录 一、引言 二、选择结构 1&#xff0c;if语句 1.1&#xff0c;if...else...语句 1.2&#xff0c;多分支语句 1.3悬空else的问题 2&#xff0c;switch语句 2.1&#xff0c;switch 2.2&#xff0c;break 2.3&#xff0c;default 一、引言 写了几个C语言代码我发现C语…

华为坤灵交换机S300, S500, S210,S220, S200, S310 如何WEB抓包

通过S系列交换机配置端口镜像实现抓包 1、应用场景 端口镜像是指将经过指定端口(源端口或者镜像端口)的报文复制一份到另一个指定端口(目的端口或者观察端口)。在网络运营与维护的过程中&#xff0c;为了便于业务监测和故障定位&#xff0c;网络管理员时常要获取设备上的业务报…

队列——一种操作受限的线性表

队列 队列&#xff08;Queue&#xff09;简称队&#xff0c;也是一种操作受限的线性表&#xff0c;只允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。向队列中插入元素称为入队或进队&#xff0c;删除元素称为出队或离队。队列中的元素是先进先出&#xff08;Fir…

MySQL学习——选项文件的使用

MySQL 的许多程序都可以从选项文件&#xff08;有时也被称为配置文件&#xff09;中读取启动选项。选项文件提供了一种方便的方式来指定常用的选项&#xff0c;这样你就不必每次运行程序时都在命令行上输入这些选项。 要确定一个程序是否读取选项文件&#xff0c;你可以使用 -…

man命令的作用

man命令是Linux操作系统中一个非常实用的命令&#xff0c;它用于查看命令的手册页面&#xff0c;帮助用户了解特定命令的用法、选项和参数。这不仅对新用户在学习如何使用新命令时很有帮助&#xff0c;也方便了经验丰富的用户快速查找命令的详细信息。以下是具体介绍&#xff1…

[论文精读]Supervised Community Detection with Line Graph Neural Networks

论文网址:[1705.08415] Supervised Community Detection with Line Graph Neural Networks (arxiv.org) 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 ⭐内涵大量可视…

高速模拟信号链的设计学习

目录 概述&#xff1a; 定义&#xff1a; 断开&#xff1a; 链路设计&#xff1a; 结论&#xff1a; 概述&#xff1a; 由于对共模参数及其与设备之间的关联缺乏了解&#xff0c;客户仍然会提出许多技术支持问题。ADC数据表指定了模拟输入的共模电压要求。关于这方面没有太…

jenkins应用2

1.jenkins应用 1.jenkins构建的流程 1.使用git参数化构建&#xff0c;用标签区分版本 2.git 拉取gitlab远程仓库代码 3.maven打包项目 4.sonarqube经行代码质量检测 5.自定义制作镜像发送到远程仓库harbor 6.在远程服务器上拉取代码启动容器 这个是构建的整个过程和步骤…