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

2024-06-22 08:12

本文主要是介绍【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 命令阻塞等待频道中的消息。

这篇关于【Redis】List的常用命令以及常用场景的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083739

相关文章

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

-bash: /bin/mv: Argument list too long mv

把labels下的所有文件mv到img文件夹下: mv labels/* img/ 报错: -bash: /bin/mv: Argument list too long  mv # Using find ... -exec + find folder2 -name '*.*' -exec mv --target-directory=folder '{}' +   # Using xar

为什么要做Redis分区和分片

Redis分区(Partitioning)和分片(Sharding)是将数据分布在多个Redis实例或多个节点上的做法。这种技术用于提高性能、可扩展性和可用性。以下是执行Redis分区和分片的主要原因: 1. **提高吞吐量**:    - 通过将数据分散到多个节点,可以并行处理更多的操作,从而提高整体吞吐量。 2. **内存限制**:    - 单个Redis实例的内存是有限的。分区允许数据

基于 Java 实现的智能客服聊天工具模拟场景

服务端代码 import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class Serv

如何理解redis是单线程的

写在文章开头 在面试时我们经常会问到这样一道题 你刚刚说redis是单线程的,那你能不能告诉我它是如何基于单个线程完成指令接收与连接接入的? 这时候我们经常会得到沉默,所以对于这道题,笔者会直接通过3.0.0源码分析的角度来剖析一下redis单线程的设计与实现。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源

帆软报表常用操作

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 帆软报表常用操作 多序号实现使用数据集作为参数空白页或者竖线页修改页面Title金额,或者保留两位小数等等设置日期格式显示图片使用公式 多序号实现 所用函数为SEQ(),如果一张报表中需要用到多个序号,那么就需要加入参数SEQ(1),SEQ(

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述   在现代的分布式系统和实时数据处理领域,消息中间件扮演着关键的角色,用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中,Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特点和优势,适用于不同的应用场景和需求。   Kafka 是一个高性能、可扩展的分布式消息队列系统,被设计用于处理大规模的数据流和实时数据传输。它

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”,意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相关依赖 <?xml version