2023.12.27 关于 Redis 数据类型 List 常用命令

news2024/11/29 0:52:10

目录

List 类型基本概念

List 类型特点

List 操作命令

LPUSH

LPUSHX

RPUSH

RPUSHX

LRANGE

LPOP

RPOP

LINDEX

LINSERT

LREM

LTRIM

LSET

阻塞版本的命令

阻塞版本 和 非阻塞版本的区别

BLPOP & BRPOP


List 类型基本概念

  • Redis 中的列表(list)相当于 数组 或者 顺序表

  • 列表 (list)约定最左侧的元素下标为 0,且支持使用 负数下标

注意:

  • list 内部的编码方式,并非是一个简单的数组,而是类似于 "双端队列"(deque)
  • 这种设计使得 list 两侧均能进行高效的插入删除,且时间复杂度均为 O(1)

List 类型特点

1、列表中的元素都是有序的

  • 有序的含义 要根据上下文进行区分
  • 有的时候谈到有序指的是 升序 或 降序,有的时候谈到有序指的是 顺序很关键
  • 此处列表中的元素都是有序的,指的是 列表中的顺序很关键
  • 即把列表元素位置颠倒、顺序调换,此时得到的 新 list 和 旧 list 是不等价的

注意:

  • 同一个词该如何理解,需要结合上下文、结合具体场景

实例理解

  • 栈/堆(数据结构、操作系统、JVM)
  • 同步(同步和互斥 、 同步和异步)

2、列表中的元素允许重复

  • Redis 中 hash 类型,其 field 不能重复

小总结:

  • Redis 的典型应用场景就是作为消息队列,最早的时候就是通过 list 类型来实现的
  • 但后来 Redis 又提供了 stream 类型来专门针对消息队列

List 操作命令

LPUSH

  • 将 一个 或 多个 元素从左放入到 list 中,相当于头插
  • lpush ——> left push

语法:

lpush key element [element ...]

时间复杂度:

  • O(1)

返回值:

  • 插入后 list 的长度

实例理解

  • 该列表中 元素 4 在最前面,因为 lpush 相当于 头插

注意:

  • 如果当前 key 已存在,且 key 对应的 value 类型不为 list,则 lpush 命令将报错

LPUSHX

  • 当 key 存在时,将一个或多个元素从左侧放入 到 list 中,相当于头插
  • 当 key 不存在时,则直接返回 0 
  • lpushx ——> left push exists

语法:

lpushx key element [element ...]

时间复杂度:

  • O(1)

返回值:

  • 插入后 list 的长度

实例理解


RPUSH

  • 将 一个 或 多个 元素从右侧放入到 list 中,相当于尾插
  • rpush ——> right push

语法:

rpush key element [element ...]

时间复杂度:

  • O(1)

返回值:

  • 插入后 list 的长度

实例理解

  • 该列表中 元素 1 在最前面,因为 rpush 相当于 尾插

RPUSHX

  • 当 key 存在时,将一个或多个元素从右侧放入 到 list 中,相当于尾插
  • 当 key 不存在时,则直接返回 0
  • rpushx ——> right push exists

语法:

rpush key element [element ...]

实例理解


LRANGE

  • 用于查看 list 中指定范围的元素

 语法:

lrange key start stop
  • 此处描述的区间为 闭区间,且下标支持负数

时间复杂度:

  • O(N)

实例理解

注意点一:

  • 此处的序号是专门给结果集使用的序号 和 list 下标无关

  • 可以看到,当我们进行 hash 操作时,也会得到这种带有序号的结果集
  • 此处的序号仅仅是标识下标返回元素的顺序 和 下标无关
  • hash 类型就没有下标的概念

注意点二:

  • 当使用 lrange 命令返回指定范围的元素时
  • 如果提供的下标超出了列表下标范围,这时 lrange 命令会如何处理呢?

答案:

  • 如果给定区间非法,如超出下标
  • lrange 命令将尽可能的获取到给定区间的元素,不会报错!


LPOP

  •  从 list 左侧取出元素,相当于 头删

语法:

lpop key

时间复杂度:

  • O(1)

返回值:

  • 取出的元素或者 nil

实例理解


RPOP

  • 从 list 右侧取出元素,相当于 尾删

语法:

rpop key

时间复杂度:

  • O(1)

返回值:

  • 取出的元素或者 nil

实例理解

注意:

  • 在当前 redis 5 版本中,LPOP 和 RPOP 命令是没有 count 参数的
  • 但 redis 6.2 版本之后,新增了 count 参数,描述了一次要删 count 个元素

小总结:

  • list 是一个双端队列,即两头插入、删除元素均十分高效,时间复杂度为 O(1)
  • 搭配使用 rpush 和 lpop 就相当于 队列
  • 搭配使用 rpush 和 rpop 就相当于 栈

LINDEX

  • 用于获取从左数第 index 位置的元素

语法:

lindex key index

时间复杂度:

  • O(N)
  • 此处 N 指的是 list 中的元素个数

返回值:

  • 如果下标非法,返回 nil 

实例理解


LINSERT

  • 用于在特定位置插入元素

语法:

linsert key <before | after> pivot element

时间复杂度:

  • O(N)
  • 此处的N表示列表的长度

返回值:

  • 插入后 新 list 的长度

实例理解

注意:

  • 万一要插入的列表中 基准值存在多个怎么办?

回答:

  • linsert 在进行插入时,会根据基准值先找到其对应的位置
  • 寻找顺序为从左往右,找到第一个符合基准值的位置打止


LREM

  • 用来删除指定元素

语法:

lrem key count element
  • count 代表要删除的个数,element 代表要删除的值

时间复杂度:

  • O(N+M)
  • N 为列表的长度,M 为要删除元素的个数,此处 M 一般不会很大,可视为O(N)

返回值:

  • 被移除的元素数量

实例理解

  •  如果 count > 0 相当于在列表中从左往右找 删除 count 个 element

  • 如果 count < 0 相当于在列表中从右往左找 删除 count 个 element

  • 如果 count = 0 相当于 删除列表中 所有的 element


LTRIM

  • 用于保留列表中 指定范围的元素,移除范围外的元素

 语法:

ltrim key start stop
  • 保留 [start ,stop] 区间的元素,即区间外面两边的元素就直接被删除了

时间复杂度:

  • O(N)
  • N 为要删除元素的个数

返回值:

  • 命令执行成功则返回 OK

实例理解


LSET

  • 用于根据下标修改对应元素

语法:

lset key index element

时间复杂度:

  • O(N)

返回值:

  • 命令执行成功则返回 OK

实例理解

注意:

  • 相较于 lindex 命令,其能很好的处理下标越界问题,如果下标越界则直接返回 nil
  • 但 lset 命令对于下标越界,其会直接报错
  • 而不会像 JavaScript 语言,动态地扩展列表 并在给定下标位置插入元素

阻塞版本的命令

  • 阻塞:当前的线程 不走了,代码不继续执行了,会在满足一定的条件之后,被唤醒
  • blpop、brpop 这俩个命令是 lpop、rpop 俩个命令的阻塞版本


阻塞版本 和 非阻塞版本的区别

1、如果 list 中存在 元素,blpop、brpop 命令和 lpop、rpop 命令作用完全相同,但如果 list 中为空, blpop 和 brpop 便会产生阻塞,一直阻塞到队列不为空为止

  • brpop 和 blpop 会根据设置的超时时间 timeout 进行阻塞等待,即 执行该命令的 redis 客户端将会阻塞,但在这期间 redis 服务器可以执行其他redis 客户端发来的命令

注意:

  • 使用 brpop、blpop 命令时,需显式地设置阻塞时间
  • 虽然此处的 brpop 和 blpop 看起来好像耗时很久,但 redis 服务器不会产生因此而产生任何负面影响

2、blpop、brpop 命令可设置多个键,将根据设置的键从左向右进行遍历,一旦有一个键对应的列表中可以弹出元素,命令立即返回

3、如果多个客户端同时对一个键执行 pop 命令,则最先执行命令的客户端将得到弹出元素

注意:

  • 无论 pop 命令是否为阻塞命令,均满足第三条特性

实例理解

  • 此处理解 blpop、brpop 命令和 lpop、rpop 命令 的区别

a、当列表不为空时:

  • lpop user:1:messages 得到 x 元素
  • blpop user:1:messages 得到 x 元素
  • 二者行为一致

b、当列表不为空时,且五秒内无新元素加入

  • lpop user:1:messages 立即得到 nil
  • blpop user:1:messages 5 执行命令 5 秒后得到 nil
  • 二者行为不一致

c、当列表不为空时,且五秒内有新元素加入

  • lpop user:1:messages 立即得到 nil
  • blpop user:1:messages 5 执行命令,直到新元素加入,得到新元素
  • 二者行为不一致

BLPOP & BRPOP

  • LPOP & RPOP 的阻塞版本
  • 前缀 b ——> block (阻塞)

注意:

  • redis 中的 list 也相当于 阻塞队列一样
  • 线程安全是通过单线程模型支持的
  • 阻塞,则只支持 队列为空 的情况,不考虑 队列满

 语法:

blpop key [key ...] timeout

brpop key [key ...] timeout

重点理解:

  • 此处我们可以指定 一个 key 或 多个 key每个 key 都需对应为 list 类型
  • 如果这些 key 对应的 list 有任何一个非空,blpop & rlpop 命令便会按照指定 key 的顺序进行遍历
  • 直到有一个 key 对应的 list 非空,就将该 list 头或尾 的元素给获取到,并立即返回该元素给客户端
  • 如果这些 key 对应的 list 均为空,此时就会根据设置的 timeout 超时时间,进行阻塞等待,等待其他客户端往这些 key 对应的 list 中插入元素
  • 进而获取到对应 key 的 list,返回该 list 的 头 或 尾 元素给客户端

注意:

  • 此处的 超时时间 timeout,单位为 秒
  • Redis 6 版本之后,允许超时时间设置成 小数,但 Redis 5 版本中超时时间,得为整数

时间复杂度:

  • O(1)

实例理解

1)针对一个 非空的列表进行操作

  • 返回的结果相当于一个 二元组
  • 该返回结果 告诉我们当前元素来自于哪个 key 的同时也告诉了我们弹出的元素值是什么

2)针对一个空的列表进行操作

3)针对多个 key 进行操作


小总结:

  • Redis 可使用 blpop & brpop 命令 作为消息队列
  • 虽然这俩命令可以在一定程度上满足 消息队列 的需求
  • 但整体来说,对于一些复杂的消息处理场景中,这俩命令还是有一定的局限性

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

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

相关文章

适用于各种危险区域的火焰识别摄像机,实时监测、火灾预防、安全监控,为安全保驾护航

火灾是一种极具破坏力的灾难&#xff0c;对人们的生命和财产造成了严重的威胁。为了更好地预防和防范火灾&#xff0c;火焰识别摄像机作为一种先进的监控设备&#xff0c;正逐渐受到人们的重视和应用。本文将介绍火焰识别摄像机在安全监控和火灾预防方面的全面应用方案。 一、火…

django之drf框架(排序、过滤、分页、异常处理)

排序 排序的快速使用 1.必须是继承GenericAPIView及其子类才能是用排序 导入OrderingFilter类&#xff0c;from rest_framework.filters import OrderingFilter 2.在类中配置类属性 filter_backends[OrderingFilter] 3.类中写属性 ordering_fields [price,id] # 必须是表的…

华为云CCE-集群内访问-根据ip访问同个pod

华为云CCE-集群内访问-根据ip访问同个pod 问题描述&#xff1a;架构如下&#xff1a;解决方法&#xff1a; 问题描述&#xff1a; 使用service集群内访问时&#xff0c;由于启用了两个pod&#xff0c;导致请求轮询在两个pod之间&#xff0c;无法返回正确的结果。 架构如下&am…

Appium+python自动化(七)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 上(超详解)

简介 “千呼万唤始出来&#xff0c;犹抱琵琶半遮面”&#xff0c;经过前边的各项准备工作&#xff0c;终于才把appium这位琵琶女请出来。那么下边就由宏哥给各位看官、小伙伴们和童鞋们来引荐这位美女&#xff08;帅哥&#xff09;。这一篇主要是对前边的内容做一个小小的总结&…

功能测试知识超详细总结

一、测试项目启动与研读需求文档 &#xff08;一&#xff09; 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产品中所有的问题。督促和协助开发人员尽快地解决程序中的缺陷。帮助项目管理人员制定合理的开发和测试计划。对缺陷进行跟…

远程桌面的3389端口如何修改

远程桌面是windows的一个功能组件&#xff0c;通过这个组件可以远程控制某台电脑的电脑桌面&#xff0c;使用过windows远程桌面的人都清楚&#xff0c;大家都知道3389是远程桌面的默认端口号&#xff0c;如果将这个端口在路由器中映射出去&#xff0c;将极大的增加服务器的风险…

.NET Core NPOI导出复杂Excel

一、引入NPOI NuGet&#xff1a; NPOI GitHub源码地址&#xff1a; GitHub - tonyqus/npoi: a .NET library that can read/write Office formats without Microsoft Office installed. No COM, no interop. 版本说明&#xff1a; NPOI 2.4.1 &#xff08;注意不同版本可能使用…

elasticsearch-hadoop.jar 6.8版本编译异常

## 背景 重新编译 elasticsearch-hadoop 包&#xff1b; GitHub - elastic/elasticsearch-hadoop at 6.8 编译 7.17 版本时很正常&#xff0c;注意设置下环境变量就好&#xff0c;JAVA8_HOME/.... 编译 6.8 版本时&#xff08;要求jdk8 / jdk9&#xff09;&#xff0c;出现…

经典目标检测YOLO系列(一)YOLOV1的复现(1)总体架构

经典目标检测YOLO系列(一)实现YOLOV1网络(1)总体架构 实现原版的YOLOv1并没有多大的意义&#xff0c;因此&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv1的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv1检测器&#xff0c;来…

毕业/课程设计——基于STM32的智能灯光控制系统(物联网、智能家居、手机APP控制、语音控制)

文章首先介绍本系统所包含的功能&#xff0c;主要包含六方面功能&#xff0c;之后逐步分享开发过程&#xff0c;其流程如下&#xff1a;点亮灯带&#xff08;三极管&#xff09;→调节灯光亮度&#xff08;PWM&#xff09;→为系统添加远程控制功能→为系统添加语音识别功能→添…

消防数据监测可视化大屏:守护城市安全的智慧之眼

在数字化时代&#xff0c;数据已经成为决策的关键。特别是在消防领域&#xff0c;快速、准确的数据分析对于及时应对火情、挽救生命财产具有不可估量的价值。为此&#xff0c;消防数据监测可视化大屏应运而生&#xff0c;成为城市安全的守护者。 一、什么是消防数据监测可视化大…

云轴科技海通期货 | 一云多芯信创云平台方案入选上海金融科技优秀解决方案

近日&#xff0c;在上海金融科技产业联盟主办的第五届上海金融科技国际论坛上&#xff0c;上海市地方金融监督管理局、中国人民银行上海总部共同发布了2023年度上海金融科技优秀应用场景及解决方案入选名单&#xff0c;其中云轴科技ZStack联合海通期货申报的“一云多芯信创云平…

centos下docker安装Rocketmq总结,以及如何更换mq端口

默认你已经装好了docker哈 安装docker-compose sudo curl -L https://github.com/docker/compose/releases/download/1.25.1-rc1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-composechmod x /usr/local/bin/docker-composedocker-compose --version成功打印…

MidJourney笔记(9)-daily_theme-docs-describe

/daily_theme 切换 #daily-theme 频道更新的通知。 但我发现在对话框那里,是没有这个命令的: 但官网是有介绍,不知道是不是版本问题还是这个命令已经无效。 但后来,我发现这个命令是要在Midjourney服务对话框那里才有,在我们后面添加的Mid

Redis布隆过滤器BloomFilter

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

Apache OFBiz RCE漏洞复现(CVE-2023-51467)

0x01 产品简介 Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。 0x02 漏洞概述 漏洞成因 该系统的身份验证机制存在缺陷,可能允许未授权用户通过绕过标准登录流程来获取后台访问权限。此外,在…

DRF从入门到精通六(排序组件、过滤组件、分页组件、异常处理)

文章目录 一、排序组件继承GenericAPIView使用DRF内置排序组件继承APIView编写排序 二、过滤组件继承GenericAPIView使用DRF内置过滤器实现过滤使用第三方模块django-filter实现and关系的过滤自定制过滤类排序搭配过滤使用 三、分页组件分页器一&#xff1a;Pagination&#xf…

python-39-flask+nginx+Gunicorn的组合应用

flask nginx Gunicorn 王炸 1 flasknginxgunicornsupervisor 1.1 myapp.py from flask import Flask app Flask(__name__)app.route("/") def test_link():return "the link is very good"if __name__"__main__":app.run()默认是5000端口…

Java学习——设计模式——创建型模式1

文章目录 创建型模式单例饿汉式懒汉式存在的问题 工厂方法简单工厂模式工厂方法模式抽象工厂模式 创建型模式 关注点是如何创建对象&#xff0c;核心思想是要把对象创建和使用相分离&#xff0c;这样两者能相对独立地变换 包括&#xff1a; 1、工厂方法&#xff1a;Factory Met…

深信服AF防火墙配置SSL VPN

防火墙版本&#xff1a;8.0.85 需提前确认防火墙是是否有SSL VPN的授权&#xff0c;确认授权用户数量 1、确认内外网接口划分 2、网络→SSL VPN&#xff0c;选择内外网接口地址 3、SSL VPN→用户管理→新增一个SSL VPN的用户 4、新增L3VPN资源&#xff0c;类型选择Other&…