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)是一种大流行病。…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...