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是一样的,这里就不再过多解释!

三、小结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode常用插件及插件安装方式

一、常用插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 说明:中文语言包扩展(简体) open in browser 说明:可以在默认浏览器或应用程序中打开当前文件 Auto Rename Tag 说明:自动重…

pyqt 进度条QProgressBar

pyqt 进度条 QProgressBar效果代码 QProgressBar 在 PyQt 应用程序中,进度条(通常称为 QProgressBar)是一个用于显示任务进度的控件。它可以显示一个水平或垂直的条形图,条形图的长度会随着进度的增加而增加。 QProgressBar 的主…

C语言---文件操作

【C语言详解】——文件操作&#xff08;建议收藏&#xff09;_c语言 写文件原理-CSDN博客 一、文件的读取 # define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<errno.h> #include<string.h>int main() {FILE * pffopen("C:\\Users\\zhw\\De…

【电路笔记】-带阻滤波器

带阻滤波器 文章目录 带阻滤波器1、概述2、典型带阻滤波器配置3、带阻滤波器示例14、陷波滤波器5、带阻滤波器示例26、总结带阻滤波器也称为陷波滤波器,阻止并拒绝位于其两个截止频率点之间的频率,并传递该范围两侧的所有这些频率。 1、概述 通过将基本 RC 低通滤波器与 RC …

Python自动实时查询预约网站的剩余名额并在有余额时发邮件提示

本文介绍基于Python语言&#xff0c;自动、定时监测某体检预约网站中指定日期的体检余额&#xff0c;并在有体检余额时自动给自己发送邮件提醒的方法。 来到春招末期&#xff0c;很多单位进入了体检流程。其中&#xff0c;银行&#xff08;尤其是四大行&#xff09;喜欢“海检”…

springboot基础及上传组件封装

简介 本文主要以文件上传为demo&#xff0c;介绍了一些 springboot web 开发的入门的技术栈。 对应刚接触 springboot 的可以参考下。 主要包括文件md5比对、生成图片缩略图、数据库迁移、文件记录持久化、请求全局异常处理等功能。 准备工作 在 idea 中创建项目&#xff…

十大排序 —— 快速排序

十大排序 —— 快速排序 快速排序一些坑快速排序的性能优点&#xff1a;缺点&#xff1a;性能优化&#xff1a; 我们今天来看看十大排序中很出名的一个算法——快速排序&#xff1a; 快速排序 快速排序&#xff08;Quick Sort&#xff09;是一种经典的、高效的排序算法&#…

centos8stream 编译安装 php-rabbit-mq模块

官方GitHub&#xff1a;https://github.com/php-amqp/php-amqp 环境依赖安装 dnf install cmake make -y 1.安装rabbitmq-c cd /usr/local/src/ wget https://github.com/alanxz/rabbitmq-c/archive/refs/tags/v0.14.0.tar.gz tar xvf v0.14.0.tar.gz cd rabbitmq-c-0.14.0/…

Linux下多线程的相关概念

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误或者有写的不好的地方的话&…

php反序列化入门

一&#xff0c;php面向对象。 1.面向对象&#xff1a; 以“对象”伪中心的编程思想&#xff0c;把要解决的问题分解成对象&#xff0c;简单理解为套用模版&#xff0c;注重结果。 2.面向过程&#xff1a; 以“整体事件”为中心的编程思想&#xff0c;把解决问题的步骤分析出…

实时监控电脑屏幕的软件是什么?三款超受欢迎的电脑监控软件

实时监控电脑屏幕的软件在现代企业管理中扮演着至关重要的角色&#xff0c;它们不仅帮助管理者实时监控员工的工作状态&#xff0c;提高工作效率&#xff0c;还通过数据分析和报告功能&#xff0c;为企业提供了优化管理流程和决策支持的依据。以下将介绍几款市面上广泛使用的实…

Redis过期策略数据淘汰策略

过期策略 一、设置过期时间 redis有四种命令可以用于设置键的生存时间和过期时间&#xff1a; EXPIRE : 将键的生存时间设为 ttl 秒 PEXPIRE :将键的生存时间设为 ttl 毫秒 EXPIREAT :将键的过期时间设为 timestamp 所指定的秒数时间戳 PEXPIREAT : 将键的过期时间设为 times…

GNU Radio创建qt time plot python OOT块

文章目录 前言一、创建自定义的 OOT 块1、安装相应依赖2、创建 OOT 块3、修改相关4、编译及安装 OOT 块 二、测试1、grc 图2、运行结果 三、资源自取 前言 官方提供的绘制时域波形的 block 名字叫做 QT GUI Time Sink&#xff0c;其底层实现是用 C 写的&#xff0c;但是我发现…

virtualbox中ubuntu22.04网络配置

第一&#xff1a;添加两个网卡&#xff0c;网卡1是NAT方式&#xff0c;网卡2是仅主机模式&#xff08;两个顺序不能颠倒&#xff09; 第二步&#xff1a;启动ifconfig查看网络

『 Linux 』文件系统

文章目录 磁盘构造磁盘抽象化 磁盘的寻址方式磁盘控制器磁盘数据传输文件系统Inode数据块(Data Blocks)超级块(SuperBlock)块组描述符(Group Descriptor) 磁盘构造 磁盘内部构造由磁头臂,磁头,主轴,盘片,盘面,磁道,柱面,扇区构成; 磁头臂&#xff1a;控制磁头的移动,可以精确地…

Exce 两列一组对齐呈现,缺失补 0

Excel 里有 多 组数据&#xff0c;每组 2 列&#xff0c;每组长度不同。第 1 列是编号&#xff0c;列之间的编号有重复。 ABCDEFGH1Mass10Mass11Mass12Mass132802200581309088146532802225938133306824779282975598142002482273148413154988335698822331305832720485110460842…

go解析yaml

go解析yaml文件关键就是结构体的创建 初学go tag字段要和yaml文件中的key对应起来&#xff0c;每个层级都要创建对应的结构体&#xff0c;有点烦 package configimport ("gopkg.in/yaml.v3""os" )type Config struct {MysqlConfig MysqlConfig yaml:&q…

Spring Boot 开发 -- 过滤器与拦截器详解

引言 在Web开发中&#xff0c;经常需要对请求进行预处理或在响应后进行后处理&#xff0c;Spring Boot提供了过滤器和拦截器两种机制来实现这一需求。虽然它们都可以用来处理HTTP请求和响应&#xff0c;但在使用场景、执行顺序和配置方式上存在明显的差异。本文将详细讲解Spri…

【UML用户指南】-01-UML基本元素的介绍(一)

1、UML的词汇表 &#xff08;1&#xff09;事物&#xff1b; &#xff08;2&#xff09;关系&#xff1b; &#xff08;3&#xff09;图。 事物是对模型中首要成分的抽象&#xff1b;关系把事物结合在一起&#xff1b;图聚集了相关的事物。 注&#xff1a;事物也称为元素 2…

东芝机械人电池低报警解除与机器人多旋转数据清零

今天启动一台设备&#xff0c;触摸屏一直显示机器人报警&#xff08;翻译过后为电池电量低&#xff09;&#xff0c;更换电池后关机重启后也不能消除&#xff0c;所以打开示教器&#xff0c;下面就来说说怎么解决此项问题&#xff08;可以参考官方发的手册&#xff0c;已手册为…