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

news2024/11/25 3:03:02

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 命令阻塞等待频道中的消息。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx实战:简单登录验证配置(基于openssl)

本文提供的是基于openssl创建的密码文件,对nginx指定的location访问。进行登录验证的配置方式。 1、验证页面配置 我的nginx实验环境是直接yum安装的,如果是自己编译安装的那么对应目录就是自己安装配置的目录。 先在/usr/share/nginx/html下创建一个usertest.html,里面添加…

Swift Combine — Notification、URLSession、Timer等Publisher的理解与使用

Notification Publisher 在Swift的Combine框架中,可以使用NotificationCenter.Publisher来创建一个能够订阅和接收通知的Publisher。 // 创建一个订阅通知的Publisher let notificationPublisher NotificationCenter.default.publisher(for: Notification.Name(&…

车辆轨迹预测系列 (一):轨迹预测方法综述解析

文章目录 车辆轨迹预测系列 (一):轨迹预测方法综述解析1、Contextual FactorsPhysics-related factors (物理相关因素):Road-related factors (道路相关因素):Interaction-related factors (交互相关因素): 2、Output TypesUnimodal Trajectory Prediction(单一模式…

计算机网络 交换机的VLAN配置

一、理论知识 1.VLAN的定义 ①VLAN虚拟局域网,是一种通过将局域网内的设备逻辑地而不是物理地划分成一个个网段从而实现虚拟工作组的技术。 ②IEEE于1999年颁布了用以标准化VLAN实现方案的802.1Q协议标准草案。 ③VLAN技术允许网络管理者将一个物理的LAN逻辑地划…

Vue DevTools

介绍 什么是 Vue DevTools? Vue DevTools 是一款旨在增强 Vue 开发者体验的工具,它是一款功能强大且用途广泛的工具,可以在使用 Vue 应用程序时显着提高您的生产力和调试能力。它的实时编辑、时间旅行调试和全面检查功能使其成为任何Vue.js开…

VLAN单臂路由

1、搭建网络 搭建拓扑、规划IP、划分网段 2、交换机配置 配置脚本(设置trunk和创建vlan很重要) Switch>enable Switch#conf t Enter configuration commands, one per line. End with CNTL/Z.//创建vlan20 Switch(config)#vlan 20 Switch(config…

react学习——08三点运算符

1、代码 let arr1[1,3,5,7,9]let arr2[2,4,6,8,10]console.log(...arr1);//展开一个数组let arr3[...arr1,...arr2]//连续数组//在函数中使用function sum (...numbers){console.log(,numbers)numbers.reduce((previousValue,currentValue)>{return previousValuecurrentVa…

网优小插件_利用Power Automate Desktop抓取物业点信息

日常在无线网络优化,经常需要提取某一地市,某个属性物业点信息(物业点名称、地址、及经纬度信息),本文利用Power Automate Desktop(PRA)和百度地图经纬度拾取网站,通过自动的方式抓取…

[数据集][目标检测]棉花叶子害虫检测数据集VOC+YOLO格式571张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):595 标注数量(xml文件个数):595 标注数量(txt文件个数):595 标注类别…

多线程环境下 System.out.println 导致死锁问题分析

背景 一个文件采集系统,使用了多线程递归采集指定目录下的文件,并为每个目录创建一个线程去采集。 这个应用每隔几天就出现罢工情况,查看进程还在,堆内存空间还很充足,就是导出堆栈时,发现几乎所有的采集…

Unity3d自定义TCP消息替代UNet实现网络连接

以前使用UNet实现网络连接,Unity2018以后被弃用了。要将以前的老程序升到高版本,最开始打算使用Mirro,结果发现并不好用。那就只能自己写连接了。 1.TCP消息结构 (1). TCP消息是按流传输的,会发生粘包。那么在发射和接收消息时就需要对消息进行打包和解包。如果接收的消息…

2024 年解锁 Android 手机的 7 种简便方法

您是否忘记了 Android 手机的 Android 锁屏密码,并且您的手机已被锁定?您需要使用锁屏解锁 Android 手机?别担心,您不是唯一一个忘记密码的人。我将向您展示如何解锁 Android 手机的锁屏。 密码 PIN 可保护您的 Android 手机和 G…

【数据结构】第十九弹---C语言实现冒泡排序算法

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、冒泡排序基本思想 2、代码的初步实现 3、代码的优化 4、代码的测试 5、时空复杂度分析 6、模拟实现qsort 6.1、冒泡排序函数 6.2、交换数…

Android SurfaceFlinger——服务启动流程(二)

SurfaceFlinger 是 Android 系统中的一个核心服务,负责管理图形缓冲区的合成和屏幕显示,是 Android 图形系统的关键组件。 一、启动流程 SurfaceFlinger 作为一个系统服务,在 Android 启动早期由 init 进程通过 servicemanager 启动。它是作…

Vue3中的常见组件通信(超详细版)

Vue3中的常见组件通信 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs4. 默认…

[Django学习]前端+后端两种方式处理图片流数据

方式1:数据库存放图片地址,图片存放在Django项目文件中 1.首先,我们现在models.py文件中定义模型来存放该图片数据,前端传来的数据都会存放在Django项目文件里的images文件夹下 from django.db import modelsclass Image(models.Model):title models.C…

深度神经网络——什么是小样本学习?

引言 小样本学习是指使用极少量的训练数据来开发人工智能模型的各种算法和技术。小样本学习致力于让人工智能模型在接触相对较少的训练实例后识别和分类新数据。小样本训练与训练机器学习模型的传统方法形成鲜明对比,传统方法通常使用大量训练数据。小样本学习是 主…

aws的alb,多个域名绑定多个网站实践

例如首次创建的alb负载均衡只有www.xxx.com 需要添加 负载 test2.xxx.com aws的Route 53产品解析到负载均衡 www.xxx.com 添加CNAME,到负载均衡的dns字段axx test2.xxx.com 添加CNAME,到负载均衡的dns字段axx 主要介绍目标组和规则 创建alb就不介…

MacOS 中 Agent 图标删除

这个是战网没有完全卸载赶紧导致的 在访达中点击前往文件夹,输入: /Users/Shared将对应的目录删掉即可。会提示需要输入密码。

Java 从零开始写一个简单的图书管理系统

了解一下 先来了解要实现一个怎样的图书管理系统 从中可以看到有操作的 使用者 和 不同 的 功能 而不同的使用者有不同的 菜单 那要如何实现呢? 请继续看下去 如何实现 首先了解我们 需要什么 图书系统需要 书,放书的 书架 ,用户 中有 管…