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

目录

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 命令 作为消息队列
  • 虽然这俩命令可以在一定程度上满足 消息队列 的需求
  • 但整体来说,对于一些复杂的消息处理场景中,这俩命令还是有一定的局限性

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

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

相关文章

水果软件2024FL Studio21.3mac苹果中文版

FL STUDIO21发布&#xff0c;提供您一直在等待的出色工作流程功能。通过新效果、多个播放列表曲目选择和无所畏惧的撤消一切编辑&#xff0c;将您的音乐带入2024年。FL Studio21中文完整版是一个功能齐全、开放式架构的PC音乐创作和制作环境。它具有基于音乐音序器的图形用户界…

flutter学习-day21-使用permission_handler进行系统权限的申请和操作

文章目录 1. 介绍2. 环境准备2-1. Android2-2. iOS 3. 使用 1. 介绍 在大多数操作系统上&#xff0c;权限不是在安装时才授予应用程序的。相反&#xff0c;开发人员必须在应用程序运行时请求用户的许可。在 flutter 开发中&#xff0c;则需要一个跨平台(iOS, Android)的 API 来…

Angular进阶之六:Progressive rendering

简介 Progressive Rendering 是一种提高 Web 应用性能的方法&#xff0c;允许页面在加载过程中逐步呈现&#xff0c;以提高用户体验。在本文中&#xff0c;我们将探讨如何在 Angular 中通过自定义指令实现 Progressive Rendering&#xff0c;特别是处理从服务器获取大量数据的…

flutter 安卓使用高德插件黑屏

地址 https://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project 下面介绍的方式是Native配置 sdk&#xff0c;也就是需要手动下载到本地在引入的方式 1、添加 jar 文件&#xff1a; 将下载的地图 SDK 的 jar包复制到工程&#xff08;此处截…

V-rep(CoppeliaSim)添加相机,与python联合仿真,并使用python读取V-rep中的RGB图与深度图

目录 前言在V-rep中构建场景建立python与V-rep通信 前言 本文主要介绍了如何使用python与V-rep联合仿真&#xff0c;并用OpenCV可视化V-rep中视觉传感器所能看到的 RGB图和深度图&#xff0c;效果图如下。 在V-rep中构建场景 本文使用的V-rep版本是3.5&#xff1a; 打开V-…

YOLOv5改进 | 2023注意力篇 | FocusedLinearAttention聚焦线性注意力

一、本文介绍 本文给大家带来的改进机制是FLAttention&#xff08;聚焦线性注意力&#xff09;是一种用于视觉Transformer模型的注意力机制(但是其也可以用在我们的YOLO系列当中从而提高检测精度)&#xff0c;旨在提高效率和表现力。其解决了两个在传统线性注意力方法中存在的…

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于FSRCNN的TPU平台超分辨率模型部署方案

2023 CCF 大数据与计算智能大赛 基于TPU平台实现超分辨率重建模型部署 基于FSRCNN的TPU平台超分辨率模型部署方案 WELL 刘渝 人工智能 研一 西安交通大学 中国-西安 1461003622qq.com 史政立 网络空间安全 研一 西安交通大学 中国-西安 1170774291qq.com 崔琳、张…

Hive中支持毫秒级别的时间精度

实际上&#xff0c;Hive 在较新的版本中已经支持毫秒级别的时间精度。你可以通过设置 hive.exec.default.serialization.format 和 mapred.output.value.format 属性为 1&#xff0c;启用 Hive 的时间精度为毫秒级。可以使用以下命令进行设置&#xff1a; set hive.exec.defau…

idea中终端Terminal页面输入命令git log后如何退出

1、idea中Terminal输入命令git log后如何退出&#xff1f; 2、解决 输入q键会自动退出git log命令

【Redis前奏曲】初识Redis

文章目录 一.Redis的一些特性(优点)1. 在内存中存储数据2. 可编程的3. 可扩展的4.持久化5. 聚集(集群)6. 高可用Redis快的原因 二. 使用案例1.数据库2. 缓存3. 消息队列 一.Redis的一些特性(优点) 我们在上一篇博客中说到,Redis是一个在内存中存储数据的中间件.用作数据库,数据…

C++面向对象(OOP)编程-C++11新特性详解

C11作为一个重要的版本&#xff0c;引入了很多新的特性&#xff0c;解决了C语言本身很多遗留的内存泄露问题&#xff0c;并且提供了很多比较灵活的用法。引入的auto&#xff0c;智能指针、线程机制都使得C语言的灵活性、安全性、并发性有了很大的提升。 本文会比较详细的介绍C1…

ffmpeg两种windows版本区别说明

版本一 必须拷贝exe和dll文件才能使用&#xff0c;如果缺少dll则exe不正正常执行 如果缺少dll &#xff0c;执行 exe会报错如下 版本2 直接拷贝exe就能使用&#xff0c;没有依赖的环境

防火墙什么用,软件防火墙与硬件防火墙有什么不一样

防火墙是一种网络安全技术&#xff0c;通过有机结合各类用于安全管理与筛选的软件和硬件设备&#xff0c;在计算机网络的内、外网之间构建一道相对隔绝的保护屏障&#xff0c;以保护用户资料与信息的安全性。 防火墙的作用的详细说明&#xff1a; 1.访问控制&#xff1a;防火…

绝地求生:【PC】12月额外特殊空投

亲爱的玩家朋友们&#xff0c;大家好&#xff01; 有一个好消息要告诉大家&#xff0c;12月丰富的活动列表中又添加了新的活动啦&#xff01;希望大家在闲游盒PUBG的陪伴下&#xff0c;为2023年画上圆满的句号&#xff01; ※可在大厅内的活动页面查看活动详情 PUBG空投节&am…

[每周一更]-(第44期):GIT版本控制之忽略文件

基础概念 在 Git 中&#xff0c;可以通过 .gitignore 文件来指定不需要纳入版本控制的文件或文件夹&#xff0c;这些被忽略的文件或文件夹不会被提交到仓库中。 在项目根目录下创建一个名为 .gitignore 的文件&#xff0c;并在其中列出需要忽略的文件或文件夹。一些常见的示例…

Spring Boot学习随笔- Jasypt加密数据库用户名和密码以及解密

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十九章、Jasypt加密 Jasypt全称是Java Simplified Encryption&#xff0c;是一个开源项目。 Jasypt与Spring Boot集成&#xff0c;以便在应用程序的属性文件中加密敏感信息&#xff0c;然后在应用程序运行…

如何在VSCode搭建ESP-IDF开发ESP32

文章目录 概要安装VScode安装ESP-IDF插件使用官方例程小结 概要 ESP-IDF(Espressif IoT Development Framework) 即乐鑫物联网开发框架&#xff0c;它基于 C/C 语言提供了一个自给自足的 SDK&#xff0c;可为在 Windows、Linux 和 macOS 系统平台上开发 ESP32 应用程序提供工具…

架构设计系列 5:常见架构介绍

前面讲了架构是什么&#xff0c;架构的发展史&#xff0c;架构设计的基础理论&#xff0c;这次针对常见架构设计风格进行介绍和分析。 一、MVC&#xff1a;三层架构经典 经典的 MVC 架构&#xff08;Model-View-Controller&#xff09;架构是软件系统架构设计中的经典&#xf…

2022年第十三届中国数据库技术大会(DTCC2022)-核心PPT资料下载

一、峰会简介 本届大会以“数据智能 价值创新”为主题&#xff0c;设置2大主会场&#xff0c;20技术专场&#xff0c;邀请超百位行业专家&#xff0c;重点围绕时序数据库、图数据技术、实时数仓技术与应用实践、云原生数据库、大数据平台与数据安全等内容展开分享和探讨&#…

18-网络安全框架及模型-信息系统安全保障模型

信息系统安全保障模型 1 基本概念 信息系统安全保障是针对信息系统在运行环境中所面临的各种风险&#xff0c;制定信息系统安全保障策略&#xff0c;设计并实现信息系统安全保障架构或模型&#xff0c;采取工程、技术、管理等安全保障要素&#xff0c;将风险减少至预定可接受的…