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)是一种大流行病。…...
Java技术栈 —— Hadoop入门(一)
Java技术栈 —— Hadoop入门(一) 一、Hadoop第一印象二、安装Hadoop三、Hadoop解析3.1 Hadoop生态介绍3.1.1 MapReduce - 核心组件3.1.2 HDFS - 核心组件3.1.3 YARN - 核心组件3.1.4 其它组件3.1.4.1 HBase3.1.4.2 Hive3.1.4.3 Spark 一、Hadoop第一印象…...
Shell脚本小游戏:石头剪刀布
脚本代码: #!/bin/bash echo "接下来的是石头剪刀布的游戏" echo "定义1:包子;2:剪刀;3:布" echo "------------------------------" NUMecho $[RANDOM%31] #1包子 #2剪刀…...
Windows10系统的音频不可用,使用疑难解答后提示【 一个或多个音频服务未运行】
一、问题描述 打开电脑,发现电脑右下角的音频图标显示为X(即不可用,无法播放声音),使用音频自带的【声音问题疑难解答】(选中音频图标,点击鼠标右键,然后选择“声音问题疑难解答(T)”…...
Unity | 渡鸦避难所-5 | 角色和摄像机之间的遮挡物半透明
1 前言 角色在地图上移动到岩石后面时,完全被岩石遮挡,玩家只能看到岩石。这逻辑看起来没问题,但并不是玩家想要看到的画面,玩家更希望关注角色的状态 为了避免角色被遮挡,可以使用 Cinemachine Collider 功能&#x…...
ResNet论文阅读和简单实现
论文:https://arxiv.org/pdf/1512.03385.pdf Deep Residual Learning for Image Recognition 本模块主要是阅读论文,会做简单的翻译(至少满足我自己能看明白)。 Introduction 由上图可见,在20层和56层的网络上训练的…...
QT上位机开发(数据库sqlite编程)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 编写软件的时候,如果用户的数据比较少,那么用json保存是非常方便的。但是一旦数据量大了之后,建议还是用数据库…...
在ARMv8中aarch64与aarch32切换
需求描述 在项目调试过程中,由于内存或磁盘空间不足需要将系统从aarch64切换到aarch32的运行状态去执行,接下来记录cortexA53的调试过程。 相关寄存器描述 ARM64: SPSR_EL3 N (Negative):表示运算结果的最高位,用于指示运算结果是否为负数。 Z (Zero):表示运算结果是否…...
拧巴的 tcp
本来想说说 tcp fastopen(tfo),但没什么意义,看 rfc7413 好了,还是 tcp 的惯常套路,引入一个新特性,解决了某个问题,带来一些新问题,然后就是各种 tradeoff,哪里适用哪里不适用。久而…...
java servlet 学生管理系统myeclipse开发oracle数据库BS模式java编程网
一、源码特点 java servlet 学生管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助servletbeandao (mvc模式开发),系统具有完整的源代码和数据库,开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Oracle 10g…...
使用buildx构建多架构镜像
使用buildx构建多架构镜像 1. 前置条件 docker 19.03以上版本 ubuntu 22.04 2. 安装相关组件 2.1 安装docker sudo apt-get updatesudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-commoncurl -fsSL https://mirrors.…...
wordpress 做论坛/百度刷自己网站的关键词
我试图写出一些文本,并在可能的情况下将其编码为utf-8,使用以下代码:outf.write((lang_name "," (script_name or "") "\n").encode("utf-8", errorsreplace))我得到以下错误:^{pr2}$…...
做移门图的 网站有哪些/seo北京公司
概要 电影文件有很多基本的组成部分。首先,文件本身被称为容器Container,容器的类型决定了信息被存放在文件中的位置。AVI和Quicktime就是容器的例子。接着,你有一组流,例如,你经常有的是一个音频流和一个视频流。&…...
沟通交流型网站广告如何做/软件开发流程
压缩和解压(针对tar、gzip、zip三种压缩格式) tar命令 主要针对.tar和.gz格式压缩文件。 前者称之为tarball,归档文件,将文件组装到.tar文件,并没有体积的减少,只是简单的封装。后者为gzip压缩文件&…...
免费b站推广网站不用下载/镇江seo
本文将解释在 .NET 技术栈中各种不同使用方式下 N E T 三个字母何时大写何时小写;前面的 “.” 什么时候加上,什么时候去掉,什么时候又使用 “dot”。 .NET 在技术文档中 如果你阅读过 https://docs.microsoft.com/zh-cn/dotnet/ 中的多数 .N…...
与国外公司合作网站建设上海公司/网站seo优化分析
原文:在WPF中自定义你的绘制(四) 在WPF中自定义你的绘制(四) 周银辉1,利用路径绘制图形(PathGeometry)有时我们需要绘制的图形可…...