【Redis】List的常用命令以及常用场景

Redis List 是一个简单的链表,支持在两端进行插入和删除操作。这种数据结构在许多场景下非常有用,例如任务队列、消息队列等。Redis 提供了一系列针对 List 的操作命令,帮助我们更高效地操作链表。

1. List常用命令

操作类型命令时间复杂度
添加push key value [value …]O(k),k是元素个
push key value [value …]O(k),k是元素个数
insert key before|after pivot valueO(n),n是pivot距离头尾的距离
查找
lrange key start end
O(s+n),s是start偏移量,n是start到end的范围
lindex key indexO(n),n是索引的偏移量
llen keyO(1)
删除lpop keyO(1)
rpop keyO(1)
lremkey count valueO(k),k是元素个数
ltrim key start endO(k),k是元素个数
修改lset key index valueO(n),n是索引的偏移量
阻塞操作blpop brpopO(1)

2.1 添加

1. LPUSH key value [value ...]

  • 将一个或多个值插入到列表头部。
  • 时间复杂度:O(k),k 是插入的元素个数。
LPUSH mylist "world"
LPUSH mylist "hello"
# 列表内容为:hello, world

2. RPUSH key value [value ...]

  • 将一个或多个值插入到列表尾部。
  • 时间复杂度:O(k),k 是插入的元素个数。
RPUSH mylist "hello"
RPUSH mylist "world"
# 列表内容为:hello, world

3. LINSERT key BEFORE/AFTER pivot value

  • 在列表中 pivot 元素的前或后插入 value。
  • 时间复杂度:O(n),n 是 pivot 离列表头部的距离。
RPUSH mylist "hello"
RPUSH mylist "world"
LINSERT mylist BEFORE "world" "there"
# 列表内容为:hello, there, world

2.2 查找

1. LRANGE key start end

  • 获取列表中指定范围内的元素[start,end]。
  • 时间复杂度:O(s+n),s 是 start 偏移量,n 是 start 到 end 的范围。
RPUSH mylist "one" "two" "three"
LRANGE mylist 0 1
# 返回:one, two

2. LINDEX key index

  • 获取列表中指定索引的元素。
  • 时间复杂度:O(n),n 是索引的偏移量。
RPUSH mylist "one" "two" "three"
LINDEX mylist 1
# 返回:two

3. LLEN key

  • 获取列表的长度。
  • 时间复杂度:O(1)。
RPUSH mylist "one" "two" "three"
LLEN mylist
# 返回:3

2.3 删除

1. LPOP key

  • 移除并返回列表的第一个元素。
  • 时间复杂度:O(1)。
RPUSH mylist "one" "two" "three"
LPOP mylist
# 返回:one,列表内容为:two, three

2. RPOP key

  • 移除并返回列表的最后一个元素。
  • 时间复杂度:O(1)。
RPUSH mylist "one" "two" "three"
RPOP mylist
# 返回:three,列表内容为:one, two

3. LREM key count value

  • 移除列表中与 value 相等的元素,移除的数量由 count 参数决定。
  • 时间复杂度:O(k),k 是被移除的元素数量。
RPUSH mylist "hello" "hello" "foo" "hello"
LREM mylist 2 "hello"
# 列表内容为:foo, hello

4. LTRIM key start end

  • 对一个列表进行修剪,只保留指定区间内的元素,不在区间内的元素都将被删除。
  • 时间复杂度:O(k),k 是被移除的元素数量。
RPUSH mylist "one" "two" "three" "four"
LTRIM mylist 1 2
# 列表内容为:two, three

2.4 修改

1. LSET key index value

  • 设置列表中指定索引的元素的值。
  • 时间复杂度:O(n),n 是索引的偏移量。
RPUSH mylist "one" "two" "three"
LSET mylist 1 "four"
# 列表内容为:one, four, three

2.5 阻塞

1. BLPOP key [key ...] timeout

  • 移除并获取列表的第一个元素,如果列表没有元素则会阻塞列表直到等待超时或发现可弹出元素为止。
  • 时间复杂度:O(1)。
RPUSH mylist "one" "two" "three"
BLPOP mylist 0
# 返回:one,列表内容为:two, three

2. BRPOP key [key ...] timeout

  • 移除并获取列表的最后一个元素,如果列表没有元素则会阻塞列表直到等待超时或发现可弹出元素为止。
  • 时间复杂度:O(1)。
RPUSH mylist "one" "two" "three"
BRPOP mylist 0
# 返回:three,列表内容为:one, two

通过以上命令,我们可以高效地操作 Redis 的 List 类型,满足不同场景下的数据处理需求。Redis 的高性能和丰富功能,使得它在实际应用中具有非常高的实用价值。

2. List内部编码

在 Redis 中,List(列表)是一种非常常用的数据结构,适用于各种场景,如任务队列、消息队列等。为了优化性能和内存使用,Redis 提供了2种内部编码方式来存储 List 数据结构。

Redis 中 List 的内部编码主要有两种:

  1. ziplist(压缩列表)
  2. linkedlist(双向链表)
  • ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries配置(默认512个),同时列表中每个元素的长度都小于 list-max-ziplist-value配置(默认 64字节)时,Redis 会选用ziplist 来作为列表的内部编码实现来减少内存消耗。
  • linkedlist(链表):当列表类型无法满足 ziplist的条件时,Redis 会使用 linkedlist 作为列表的内部实现。

3. 使用场景

3.1 消息队列

如图所示,Redis 可以使用lpush+brpop 命令组合实现经典的阻塞式生产者-消费者模型队列,生产者客户端使用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop命令阻塞式地从队列中"争抢"队首元素。通过多个客户端来保证消费的负载均衡和高可用性。

 

# 生产者将消息推送到队列
LPUSH message_queue "message1"
LPUSH message_queue "message2"

# 消费者从队列取出消息
RPOP message_queue
# 返回: message1
RPOP message_queue
# 返回: message2

3.2 分频道的消息队列

如图所示,Redis 同样使用 lpush+brpop 命令,但通过不同的键模拟频道的概念,不同的消费者可以通过 brpop 不同的键值,实现订阅不同频道的理念。

分频道消息队列是一种将消息按照频道进行分类和分发的消息系统。其主要特点如下:

  • 生产者:向特定的频道发送消息。
  • 消费者:订阅一个或多个频道,获取对应频道的消息。
  • 频道:消息的分类标识,用于区分不同类型的消息。

使用 Redis List 实现分频道消息队列的基本思路是:

  1. 生产者 使用 LPUSH 命令将消息推送到对应频道的 List。
  2. 消费者 使用 BRPOP 命令阻塞等待频道中的消息。

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

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

相关文章

Redis-使用 jedis 操作数据

文章目录 1、Jedis简介2、环境准备3、创建maven普通项目,导入如下依赖4、测试JAVA程序和Redis之间的通信 1、Jedis简介 "Jedis" 通常是作为 "Java Redis" 的缩写或简称来理解的。Java Embedded Data Structures Interface 表示 Java嵌入式数据结构接口 2、…

如何生成protobuf文件

背景 protobuf是一种用于序列化结构数据的工具,实现数据的存储与交换,与编程语言和开发平台无关。 序列化:将结构数据或者对象转换成能够用于存储和传输的格式。 反序列化:在其他的计算环境中,将序列化后的数据还原为…

解决双击bootstrap.bat没有生成b2.exe文件

双击bootstrap.bat但是并没有没有生成b2.exe文件,会报如下错误: "cl" 不是内部或外部命令,也不是可运行的程序 或批处理文件。D:\cppsoft\boost_1_85_0\tools\build\src\engine>dir *.exe 驱动器 D 中的卷是 Data 卷的序列号是…

Swoole_loader扩展安装图文教程 Swoole扩展文件下载

Swoole_loader扩展安装图文教程 Swoole扩展文件下载 安装和配置Swoole Loader 1 - 下载Swoole Loader 请下载兼容PHP7.2和非线程安全的Swoole Loader扩展,点击下载适配环境的扩展文件 2 - 安装Swoole Loader 将刚才下载的Swoole Loader扩展文件(swo…

AI播客下载:Machine Learning Street Talk(AI机器学习)

该频道由 Tim Scarfe 博士、Yannic Kilcher 博士和 Keith Duggar 博士管理。 他们做了出色的工作,对每个节目进行了彻底的研究,并与机器学习行业中一些受过最高教育、最全面的嘉宾进行了双向对话。 每一集都会教授一些新内容,并且提供未经过滤…

【从零到一】电子元器件网站建设/开发方案、流程及搭建要点全解

电子元器件行业在数字化转型的大潮下也迎来了前所未有的发展机遇。一个高效、专业、用户友好的电子元器件网站,不仅能够提升品牌形象,还能显著提高销售转化率,增强客户粘性。道合顺芯站点将详细阐述电子元器件开发方案、实施流程,…

STM32通过SPI硬件读写W25Q64

文章目录 1. W25Q64 2. 硬件电路 3. 软件/硬件波形对比 4. STM32中的SPI外设 5. 代码实现 5.1 MyI2C.c 5.2 MyI2C.h 5.3 W25Q64.c 5.4 W25Q64.h 5.5 W25Q64_Ins.h 5.6 main.c 1. W25Q64 对于SPI通信和W25Q64的详细解析可以看下面这篇文章 STM32单片机SPI通信详解-C…

C语言 | Leetcode C语言题解之第172题阶乘后的零

题目: 题解: int trailingZeroes(int n) {int ans 0;while (n) {n / 5;ans n;}return ans; }

南昌代理记账报税的详细说明

随着社会经济的发展和企业运营的需要,越来越多的企业开始寻找专业的会计服务,我们特别为您提供南昌代理记账报税的相关信息。 https://www.9733.cn/news/detail/166.html 代理记账的主要功能 1、代理记账为企业提供专业化的财务咨询服务。 2、及时准确…

【Linux系统】Linux 命令行查看当前目录的总大小/总磁盘空间

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-06-22 0…

ECharts 蓝色系-荧光图标折线图01案例

ECharts 蓝色系-荧光图标折线图01案例 图表意义 本折线图案例展示了一周内不同路线的使用情况或数据统计。通过折线的上升和下降,可以直观地观察到每条路线的流量或数据变化趋势,从而进行分析和决策。 效果预览 效果图展示不同路线的数据统计和个性化…

DVWA 靶场 Authorisation Bypass 通关解析

前言 DVWA代表Damn Vulnerable Web Application,是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序,旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…

Java宝藏实验资源库(8)多态、抽象类和接口

一、实验目的 理解面向对象程序的基本概念。掌握类的继承和多态的实现机制。熟悉抽象类和接口的用法。 二、实验内容、过程及结果 **1.Using the classes defined in Listing 13.1, 13.2, 13.3, write a test program that creates an array of some Circle and Rectangle in…

docker换源

文章目录 前言1. 查找可用的镜像源2. 配置 Docker 镜像源3. 重启 Docker 服务4. 查看dock info是否修改成功5. 验证镜像源是否更换成功注意事项 前言 在pull镜像时遇到如下报错: ┌──(root㉿kali)-[/home/longl] └─# docker pull hello-world Using default …

IPv6 address status lifetime

IPv6 地址状态转换 Address lifetime (地址生存期) 每个配置的 IPv6 单播地址都有一个生存期设置,该设置确定该地址在必须刷新或替换之前可以使用多长时间。某些地址设置为“永久”并且不会过期。“首选”和“有效”生存期用于指定其使用期限和可用性。 自动配置的…

基于WPF技术的换热站智能监控系统16--动态数据绑定

1、实现思路 1)实时读取到的数据绑定到前台UI控件上,这个通过MVVM模式实现,同时注意实时读取必须通过任务task异步方式,这就需要读取PLC数据。 2)UI控件的动作,如开或关水泵,必定能够将值写入…

常见的Wi-Fi蓝牙模组

在嵌入式领域,常见的Wi-Fi蓝牙模组确实包括多个知名品牌,如乐鑫、安信可和移远等,以前可能你听的最多的是ESP8266,不过今天讨论的是Wi-Fi蓝牙模组,而8266本身并不内置蓝牙功能,不在介绍范围。而拿到模块之后…

graalvm jdk和openjdk

下载地址:https://github.com/graalvm/graalvm-ce-builds/releases 官网: https://www.graalvm.org

设计模式4-模版方法

设计模式 重构获得模式重构的关键技法1. 静态转动态2. 早绑定转晚绑定3. 继承转组合4. 编译时依赖转运行时依赖5. 紧耦合转松耦合 组件协助动机模式定义结构 要点总结。 例子示例解释: 重构获得模式 设计模式的目的是应对变化,提高复用 设计模式的要点…

数据通信与网络(五)

交换机功能: 地址学习(端口/MAC地址映射表) 通信过滤(基于端口/MAC地址映射表) 生成树协议(断开环路) 隔离冲突域 生成树协议 隔离冲突域 交换机配置模式(用不同级别的命令对交换机进行配置) 普…