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 ...] timeoutbrpop 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 命令 作为消息队列
- 虽然这俩命令可以在一定程度上满足 消息队列 的需求
- 但整体来说,对于一些复杂的消息处理场景中,这俩命令还是有一定的局限性
相关文章:
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&am…...
【Web】vulhub-httpd apache解析漏洞复现(1)
目录 ①CVE-2017-15715 ②apache_parsing_vulnerability ①CVE-2017-15715 贴出源码: <?php if(isset($_FILES[file])) {$name basename($_POST[name]);$ext pathinfo($name,PATHINFO_EXTENSION);if(in_array($ext, [php, php3, php4, php5, phtml, pht]))…...
市场复盘总结 20240103
仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整 昨日回顾: 方法一:指标选股 select * from dbo.ResultAll where 入选类型 like %指标选股% and 入选日期=20240103;方法二:趋势选股法 1、最低价持续3日上涨 2、均价…...
Java技术栈 —— Redis的雪崩、穿透与击穿
Java技术栈 —— Redis的雪崩、穿透与击穿 〇、实验的先导条件(NginxJmeter)一、Redis缓存雪崩、缓存穿透、缓存击穿1.1 雪崩1.2 穿透1.3 击穿 二、Redis应用场景——高并发2.1 单机部署的高并发问题与解决(JVM级别锁)2.2 集群部署…...
Scala知识点——App类
我们在代码中一般程序都是是通过main方法进入。但是在scala中提供了一个App类,通过继承可以实现不用显式的调用main方法就能运行。 App类中实现了main方法:...
(vue)增加行,对应行删除
(vue)增加行,对应行删除 效果: 代码: <div v-for"(ele,i) of algorithmList" :key"i"><el-form-item label"模型类型"><el-selectv-model"ele.algorithmId"placeholder"选择模…...
案例088:基于微信小程序的校车购票平台设计与实现
文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…...
pytorch集智-1安装与简单使用
1 安装 1.1 简介 pytorch可用gpu加速,也可以不加速。gpu加速是通过cuda来实现,cuda是nvidia推出的一款运算平台,它可以利用gpu提升运算性能。 所以如果要装带加速的pytorch,需要先装cuda,再装pytorch,如…...
『番外篇六』SwiftUI 取得任意视图全局位置的三种方法
概览 在 SwiftUI 开发中,利用描述性代码我们可以很轻松的构建各种丰富多彩的视图。我们可以设置它们的大小、位置、颜色并应用不计其数的修改器。 但是,小伙伴们是否想过在 SwiftUI 中如何获取一个视图的全局位置坐标呢? 在本篇博文中,您将学到如下内容: 概览1. SwiftU…...
Ribbon相关面试及答案(2024)
1、Ribbon是什么,它在微服务架构中扮演什么角色? Ribbon是一个客户端负载均衡器,它在微服务架构中扮演着关键性的角色。Ribbon的设计理念是在客户端进行服务发现和负载均衡,这种方式不同于传统的通过中心化的负载均衡器ÿ…...
【Mybatis】深入学习MyBatis:CRUD操作与动态SQL实战指南
🍎个人博客:个人主页 🏆个人专栏: Mybatis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 一基本用法 1 CRUD操作 1. 增加(Create) 2. 查询(Read) 3. 更新&#x…...
前端uniapp的tab选项卡for循环切换、开通VIP实战案例【带源码/最新】
目录 效果图图1图2 源码最后 这个案例是uniapp,同样也适用Vue项目,语法一样for循环,点击切换 效果图 图1 图2 源码 直接代码复制查看效果 <template><view class"my-helper-service-pass"><view class"tab…...
【我的RUST库】get_local_info
get_local_info是一个获取linux本地信息的Rust三方库,其目标是降低获取本地linux系统信息的难度。支持银河麒麟10、UOS、鸿蒙等国产系统 项目维护:长期 当前版本0.1.4,已有功能: 1.获取活动网卡信息:网卡࿰…...
【JUC】Synchronized及JVM底层原理
Synchronized使用方式 Synchronized有三种应用方式 作用于实例方法,当前示实例加锁进入同步代码前要获得当前实例的锁,即synchronized普通同步方法,调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置。 如果设置了,执行…...
用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成 --【本人】
一、插件安装 1.1 搜索插件 mybatis 安装 1.2 接受安装 1.3 再次进入,说明安装好了 1.4 与鱼皮不同点 1)mybatis 版本不一致 鱼皮: 本人: 2)鱼皮需重启安装 本人不需要 1.5 【需完成 三、步骤,再来看】 …...
深入了解隧道代理HTTP的协议与技术细节
隧道代理HTTP,作为一种网络通信的桥梁技术,其背后的协议与技术细节承载着网络世界的无尽奥秘。对于技术人员而言,深入了解这些细节,不仅有助于优化网络性能,还能为网络安全提供坚实的保障。 一、隧道代理HTTP的协议基…...
系统运维-Apache服务的基础安装与使用
Apache:WEB服务器的软件 Apache HTTP是一个模块化的服务器,源于NCSAhttpd服务器,经过多次修改,成为世界使用排名第一的WEB服务器软件。 目录 HTTP HTTPS HTTP 首先安装apache yum install httpd* -y #install http 要有网站首…...
Android 相机库CameraView源码解析 (四) : 带滤镜预览
1. 前言 这段时间,在使用 natario1/CameraView 来实现带滤镜的预览、拍照、录像功能。 由于CameraView封装的比较到位,在项目前期,的确为我们节省了不少时间。 但随着项目持续深入,对于CameraView的使用进入深水区,逐…...
蜥蜴目标检测数据集VOC格式1400张
蜥蜴,一种爬行动物,以其独特的形态和习性,成为了人们关注的焦点。 蜥蜴的外观多样,体型大小不一。它们通常拥有长条的身体、四肢和尾巴,鳞片覆盖全身,这使得它们能够在各种环境中轻松移动。大多数蜥蜴拥有…...
2020年认证杯SPSSPRO杯数学建模C题(第一阶段)抗击疫情,我们能做什么全过程文档及程序
2020年认证杯SPSSPRO杯数学建模 C题 抗击疫情,我们能做什么 原题再现: 2020 年 3 月 12 日,世界卫生组织(WHO)宣布,席卷全球的冠状病毒引发的病毒性肺炎(COVID-19)是一种大流行病。…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...






















