当前位置: 首页 > news >正文

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 中的列表&#xff08;list&am…...

【Web】vulhub-httpd apache解析漏洞复现(1)

目录 ①CVE-2017-15715 ②apache_parsing_vulnerability ①CVE-2017-15715 贴出源码&#xff1a; <?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的雪崩、穿透与击穿 〇、实验的先导条件&#xff08;NginxJmeter&#xff09;一、Redis缓存雪崩、缓存穿透、缓存击穿1.1 雪崩1.2 穿透1.3 击穿 二、Redis应用场景——高并发2.1 单机部署的高并发问题与解决&#xff08;JVM级别锁&#xff09;2.2 集群部署…...

Scala知识点——App类

我们在代码中一般程序都是是通过main方法进入。但是在scala中提供了一个App类&#xff0c;通过继承可以实现不用显式的调用main方法就能运行。 App类中实现了main方法&#xff1a;...

(vue)增加行,对应行删除

(vue)增加行&#xff0c;对应行删除 效果&#xff1a; 代码&#xff1a; <div v-for"(ele,i) of algorithmList" :key"i"><el-form-item label"模型类型"><el-selectv-model"ele.algorithmId"placeholder"选择模…...

案例088:基于微信小程序的校车购票平台设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

pytorch集智-1安装与简单使用

1 安装 1.1 简介 pytorch可用gpu加速&#xff0c;也可以不加速。gpu加速是通过cuda来实现&#xff0c;cuda是nvidia推出的一款运算平台&#xff0c;它可以利用gpu提升运算性能。 所以如果要装带加速的pytorch&#xff0c;需要先装cuda&#xff0c;再装pytorch&#xff0c;如…...

『番外篇六』SwiftUI 取得任意视图全局位置的三种方法

概览 在 SwiftUI 开发中,利用描述性代码我们可以很轻松的构建各种丰富多彩的视图。我们可以设置它们的大小、位置、颜色并应用不计其数的修改器。 但是,小伙伴们是否想过在 SwiftUI 中如何获取一个视图的全局位置坐标呢? 在本篇博文中,您将学到如下内容: 概览1. SwiftU…...

Ribbon相关面试及答案(2024)

1、Ribbon是什么&#xff0c;它在微服务架构中扮演什么角色&#xff1f; Ribbon是一个客户端负载均衡器&#xff0c;它在微服务架构中扮演着关键性的角色。Ribbon的设计理念是在客户端进行服务发现和负载均衡&#xff0c;这种方式不同于传统的通过中心化的负载均衡器&#xff…...

【Mybatis】深入学习MyBatis:CRUD操作与动态SQL实战指南

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 一基本用法 1 CRUD操作 1. 增加&#xff08;Create&#xff09; 2. 查询&#xff08;Read&#xff09; 3. 更新&#x…...

前端uniapp的tab选项卡for循环切换、开通VIP实战案例【带源码/最新】

目录 效果图图1图2 源码最后 这个案例是uniapp&#xff0c;同样也适用Vue项目&#xff0c;语法一样for循环&#xff0c;点击切换 效果图 图1 图2 源码 直接代码复制查看效果 <template><view class"my-helper-service-pass"><view class"tab…...

【我的RUST库】get_local_info

get_local_info是一个获取linux本地信息的Rust三方库&#xff0c;其目标是降低获取本地linux系统信息的难度。支持银河麒麟10、UOS、鸿蒙等国产系统 项目维护&#xff1a;长期 当前版本0.1.4&#xff0c;已有功能&#xff1a; 1.获取活动网卡信息&#xff1a;网卡&#xff0…...

【JUC】Synchronized及JVM底层原理

Synchronized使用方式 Synchronized有三种应用方式 作用于实例方法&#xff0c;当前示实例加锁进入同步代码前要获得当前实例的锁&#xff0c;即synchronized普通同步方法&#xff0c;调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置。 如果设置了&#xff0c;执行…...

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成 --【本人】

一、插件安装 1.1 搜索插件 mybatis 安装 1.2 接受安装 1.3 再次进入&#xff0c;说明安装好了 1.4 与鱼皮不同点 1&#xff09;mybatis 版本不一致 鱼皮&#xff1a; 本人&#xff1a; 2&#xff09;鱼皮需重启安装 本人不需要 1.5 【需完成 三、步骤&#xff0c;再来看】 …...

深入了解隧道代理HTTP的协议与技术细节

隧道代理HTTP&#xff0c;作为一种网络通信的桥梁技术&#xff0c;其背后的协议与技术细节承载着网络世界的无尽奥秘。对于技术人员而言&#xff0c;深入了解这些细节&#xff0c;不仅有助于优化网络性能&#xff0c;还能为网络安全提供坚实的保障。 一、隧道代理HTTP的协议基…...

系统运维-Apache服务的基础安装与使用

Apache&#xff1a;WEB服务器的软件 Apache HTTP是一个模块化的服务器&#xff0c;源于NCSAhttpd服务器&#xff0c;经过多次修改&#xff0c;成为世界使用排名第一的WEB服务器软件。 目录 HTTP HTTPS HTTP 首先安装apache yum install httpd* -y #install http 要有网站首…...

Android 相机库CameraView源码解析 (四) : 带滤镜预览

1. 前言 这段时间&#xff0c;在使用 natario1/CameraView 来实现带滤镜的预览、拍照、录像功能。 由于CameraView封装的比较到位&#xff0c;在项目前期&#xff0c;的确为我们节省了不少时间。 但随着项目持续深入&#xff0c;对于CameraView的使用进入深水区&#xff0c;逐…...

蜥蜴目标检测数据集VOC格式1400张

蜥蜴&#xff0c;一种爬行动物&#xff0c;以其独特的形态和习性&#xff0c;成为了人们关注的焦点。 蜥蜴的外观多样&#xff0c;体型大小不一。它们通常拥有长条的身体、四肢和尾巴&#xff0c;鳞片覆盖全身&#xff0c;这使得它们能够在各种环境中轻松移动。大多数蜥蜴拥有…...

2020年认证杯SPSSPRO杯数学建模C题(第一阶段)抗击疫情,我们能做什么全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 C题 抗击疫情&#xff0c;我们能做什么 原题再现&#xff1a; 2020 年 3 月 12 日&#xff0c;世界卫生组织&#xff08;WHO&#xff09;宣布&#xff0c;席卷全球的冠状病毒引发的病毒性肺炎&#xff08;COVID-19&#xff09;是一种大流行病。…...

Java技术栈 —— Hadoop入门(一)

Java技术栈 —— Hadoop入门&#xff08;一&#xff09; 一、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脚本小游戏:石头剪刀布

脚本代码&#xff1a; #!/bin/bash echo "接下来的是石头剪刀布的游戏" echo "定义1&#xff1a;包子&#xff1b;2&#xff1a;剪刀&#xff1b;3&#xff1a;布" echo "------------------------------" NUMecho $[RANDOM%31] #1包子 #2剪刀…...

Windows10系统的音频不可用,使用疑难解答后提示【 一个或多个音频服务未运行】

一、问题描述 打开电脑&#xff0c;发现电脑右下角的音频图标显示为X&#xff08;即不可用&#xff0c;无法播放声音&#xff09;&#xff0c;使用音频自带的【声音问题疑难解答】&#xff08;选中音频图标&#xff0c;点击鼠标右键&#xff0c;然后选择“声音问题疑难解答(T)”…...

Unity | 渡鸦避难所-5 | 角色和摄像机之间的遮挡物半透明

1 前言 角色在地图上移动到岩石后面时&#xff0c;完全被岩石遮挡&#xff0c;玩家只能看到岩石。这逻辑看起来没问题&#xff0c;但并不是玩家想要看到的画面&#xff0c;玩家更希望关注角色的状态 为了避免角色被遮挡&#xff0c;可以使用 Cinemachine Collider 功能&#x…...

ResNet论文阅读和简单实现

论文&#xff1a;https://arxiv.org/pdf/1512.03385.pdf Deep Residual Learning for Image Recognition 本模块主要是阅读论文&#xff0c;会做简单的翻译&#xff08;至少满足我自己能看明白&#xff09;。 Introduction 由上图可见&#xff0c;在20层和56层的网络上训练的…...

QT上位机开发(数据库sqlite编程)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 编写软件的时候&#xff0c;如果用户的数据比较少&#xff0c;那么用json保存是非常方便的。但是一旦数据量大了之后&#xff0c;建议还是用数据库…...

在ARMv8中aarch64与aarch32切换

需求描述 在项目调试过程中,由于内存或磁盘空间不足需要将系统从aarch64切换到aarch32的运行状态去执行,接下来记录cortexA53的调试过程。 相关寄存器描述 ARM64: SPSR_EL3 N (Negative):表示运算结果的最高位,用于指示运算结果是否为负数。 Z (Zero):表示运算结果是否…...

拧巴的 tcp

本来想说说 tcp fastopen(tfo)&#xff0c;但没什么意义&#xff0c;看 rfc7413 好了&#xff0c;还是 tcp 的惯常套路&#xff0c;引入一个新特性&#xff0c;解决了某个问题&#xff0c;带来一些新问题&#xff0c;然后就是各种 tradeoff&#xff0c;哪里适用哪里不适用。久而…...

java servlet 学生管理系统myeclipse开发oracle数据库BS模式java编程网

一、源码特点 java servlet 学生管理系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助servletbeandao (mvc模式开发)&#xff0c;系统具有完整的源代码和数据库&#xff0c;开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为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 做论坛/百度刷自己网站的关键词

我试图写出一些文本&#xff0c;并在可能的情况下将其编码为utf-8&#xff0c;使用以下代码&#xff1a;outf.write((lang_name "," (script_name or "") "\n").encode("utf-8", errorsreplace))我得到以下错误&#xff1a;^{pr2}$…...

wordpress评论验证码插件/免费网站申请域名

...

做移门图的 网站有哪些/seo北京公司

概要 电影文件有很多基本的组成部分。首先&#xff0c;文件本身被称为容器Container&#xff0c;容器的类型决定了信息被存放在文件中的位置。AVI和Quicktime就是容器的例子。接着&#xff0c;你有一组流&#xff0c;例如&#xff0c;你经常有的是一个音频流和一个视频流。&…...

沟通交流型网站广告如何做/软件开发流程

压缩和解压&#xff08;针对tar、gzip、zip三种压缩格式&#xff09; tar命令 主要针对.tar和.gz格式压缩文件。 前者称之为tarball&#xff0c;归档文件&#xff0c;将文件组装到.tar文件&#xff0c;并没有体积的减少&#xff0c;只是简单的封装。后者为gzip压缩文件&…...

免费b站推广网站不用下载/镇江seo

本文将解释在 .NET 技术栈中各种不同使用方式下 N E T 三个字母何时大写何时小写&#xff1b;前面的 “.” 什么时候加上&#xff0c;什么时候去掉&#xff0c;什么时候又使用 “dot”。 .NET 在技术文档中 如果你阅读过 https://docs.microsoft.com/zh-cn/dotnet/ 中的多数 .N…...

与国外公司合作网站建设上海公司/网站seo优化分析

原文:在WPF中自定义你的绘制&#xff08;四&#xff09; 在WPF中自定义你的绘制&#xff08;四&#xff09; 周银辉1&#xff0c;利用路径绘制图形&#xff08;PathGeometry&#xff09;有时我们需要绘制的图形可…...