列表(List)相当于数组或者顺序表

一、通用命令

  1. LPUSH key value1 [value2 ...]

    • 在列表 key 的左侧(头部)插入一个或多个值。
    • 示例:LPUSH fruits apple banana → 列表变为 [banana, apple]

  • LPUSHX 只有列表已存在时才会执行插入,若列表不存在则不进行任何操作
  1. RPUSH key value1 [value2 ...]

    • 在列表 key 的右侧(尾部)插入一个或多个值。
    • 示例:RPUSH fruits orange → 列表变为 [banana, apple, orange]

RPUSHX 只有列表已存在时才会执行插入,若列表不存在则不进行任何操作

  1. LPOP key

    • 移除并返回列表 key 左侧的第一个元素。
    • 示例:LPOP fruits → 返回 banana,列表变为 [apple, orange]

lpop后面有个count参数,表示要删删除几个元素

  1. RPOP key

    • 移除并返回列表 key 右侧的最后一个元素。
    • 示例:RPOP fruits → 返回 orange,列表变为 [apple]

rpop后面有个count参数,表示要删删除几个元素

  1. LRANGE key start stop

    • 返回列表 key 中从索引 start 到 stop 的元素(包含两端)。
    • 索引支持负数:-1 表示最后一个元素,-2 表示倒数第二个,以此类推。
    • 示例:LRANGE fruits 0 -1 → 返回列表所有元素

当下标越界后,会尽可能的返回结果,返回区间内存在的元素

  1. LLEN key

    • 返回列表 key 的长度(元素个数)。
    • 示例:LLEN fruits → 返回当前列表长度

  1. LINDEX key index

    • 返回列表 key 中索引为 index 的元素。
    • 示例:LINDEX fruits 0 → 返回列表第一个元素

1.LINSERT 是用于在列表的指定元素前后插入新元素的命令,其语法如下:

LINSERT key BEFORE|AFTER pivot value

参数说明

  • key:列表的键名
  • BEFORE|AFTER:指定插入位置(在 pivot 元素之前或之后)
  • pivot:列表中已存在的参考元素
  • value:要插入的新元素
  1. LSET key index value

    • 将列表 key 中索引为 index 的元素设置为 value
    • 示例:LSET fruits 0 grape → 将第一个元素改为 grape
  2. LREM key count value

    • 从列表 key 中删除 count 个值为 value 的元素。
    • count > 0:从左侧开始删除;count < 0:从右侧开始删除;count = 0:删除所有。
    • 示例:LREM fruits 2 apple → 从左侧删除 2 个 apple
  3. LTRIM key start stop

    • 保留列表 key 中从 start 到 stop 的元素,删除其他元素(修剪列表)。
    • 示例:LTRIM fruits 0 1 → 只保留前两个元素
  4. RPOPLPUSH source destination

    • 从 source 列表右侧弹出元素,同时将其插入 destination 列表左侧。
    • 示例:RPOPLPUSH fruits backups → 转移最后一个元素到 backups 列表头部

  5、BLPOP和BRPOP

在 Redis 中,BLPOP 和 BRPOP 是 阻塞式列表弹出命令,核心作用是从列表(List)的头部或尾部弹出元素;若列表为空,则命令会阻塞当前客户端,直到有元素可用或超时,常用于实现 消息队列、任务调度、分布式锁等待 等场景。

一、核心定义与语法

两者逻辑一致,仅弹出元素的位置不同:

  • BLPOP(Block Left Pop):从列表 头部(左侧) 弹出元素,空列表时阻塞。
  • BRPOP(Block Right Pop):从列表 尾部(右侧) 弹出元素,空列表时阻塞。

1. 基本语法

BLPOP key [key ...] timeout
BRPOP key [key ...] timeout

参数说明:

参数含义
key [key...]1 个或多个列表键(支持同时监听多个列表,按顺序优先级处理)。
timeout阻塞超时时间(单位:秒):
- 若 timeout=0:永久阻塞,直到有元素弹出;
- 若 timeout>0:超时后返回 nil,不阻塞。

2. 返回值

命令返回一个 二元数组,格式如下:

返回值结构说明
第一个元素弹出元素所属的 列表键名(若监听多个键,需通过此值判断元素来源)。
第二个元素从列表中弹出的 具体元素值
超时返回若超时且无元素,返回 nil

二、核心特性与差异

1. 共性:阻塞逻辑与优先级

无论 BLPOP 还是 BRPOP,阻塞时均遵循以下规则:

  • 空列表阻塞:若所有监听的列表均为空,客户端会进入 阻塞状态(不占用 CPU,Redis 会将其加入 “阻塞客户端队列”),不影响其他命令执行。
  • 元素触发唤醒:当其他客户端向任一监听列表添加元素(如 LPUSH/RPUSH)时,Redis 会立即唤醒阻塞的客户端,执行弹出操作。
  • 多键优先级:若同时监听多个列表(如 BLPOP list1 list2 0),Redis 会 按键的顺序依次检查,仅从第一个非空列表中弹出元素(list1 优先级高于 list2)。
  • 单元素原子性:即使多个客户端同时阻塞监听同一个列表,Redis 会保证 每个元素仅被一个客户端弹出(原子操作,无 “竞态问题”)。

2. 差异:弹出位置与典型场景

命令弹出位置典型使用场景
BLPOP列表头部1. 实现 “先进先出(FIFO)” 队列(配合 RPUSH 入队);
2. 优先级队列(头部元素优先处理)。
BRPOP列表尾部1. 实现 “后进先出(LIFO)” 栈(配合 RPUSH 入栈);
2. 简单消息队列(尾部弹出避免头部阻塞)。

三、使用示例

假设存在两个列表 task_queue(任务队列)和 urgent_queue(紧急任务队列),用 BLPOP 优先处理紧急任务:

1. 列表为空时阻塞

执行命令(超时时间 30 秒):

BLPOP urgent_queue task_queue 30

此时两个列表均为空,客户端进入 阻塞状态,等待元素插入。

2. 其他客户端插入元素

另一个客户端向 urgent_queue 插入紧急任务:

RPUSH urgent_queue "fix_login_bug"

3. 阻塞客户端被唤醒并返回结果

原阻塞客户端立即被唤醒,返回以下结果(二元数组):

1) "urgent_queue"  # 元素所属的键
2) "fix_login_bug" # 弹出的元素值

4. 超时无元素返回

若 30 秒内无任何客户端向 urgent_queue 或 task_queue 插入元素,命令超时返回 nil

(nil)

四、关键注意事项

  1. 阻塞仅影响当前客户端
    阻塞期间,当前客户端无法执行其他命令,但 Redis 服务器仍可正常处理其他客户端的请求(非全局阻塞)。

  2. 避免永久阻塞(timeout=0)的风险
    若设置 timeout=0(永久阻塞),需确保有其他客户端会向监听列表插入元素;否则当前客户端会一直阻塞,需通过 CLIENT KILL 命令强制关闭连接。

  3. 键不存在的处理
    若监听的键不存在(如 BLPOP non_exist_key 5),Redis 会将其视为 “空列表”,同样触发阻塞,直到键被创建并插入元素。

  4. 与非阻塞命令的区别(LPOP/RPOP)

    • LPOP/RPOP:列表为空时立即返回 nil,不阻塞;
    • BLPOP/BRPOP:列表为空时阻塞,适合需要 “等待元素” 的场景(如消息队列消费者)。
  5. 分布式场景的限制
    若多个客户端同时阻塞监听同一个列表,Redis 会按 “先阻塞先唤醒” 的顺序分配元素(公平性保证),但不支持 “广播”(一个元素仅被一个客户端消费)。

五、典型应用场景

  1. 消息队列(MQ)

    • 生产者:用 RPUSH 向列表尾部插入消息;
    • 消费者:用 BRPOP 阻塞监听列表,有消息时立即消费(避免轮询空列表,减少资源浪费)。
  2. 分布式任务调度
    多个 worker 进程用 BLPOP 监听同一个任务列表,Redis 自动将任务分配给空闲 worker(原子性弹出,避免重复处理)。

  3. 分布式锁的 “等待重试”
    当客户端获取锁失败时,用 BLPOP 阻塞监听 “锁释放通知列表”,待持有锁的客户端释放锁后,通过 LPUSH 通知等待客户端重试,减少轮询开销。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】相机输出图片时保留时间戳数据

有时候需要参考时间戳&#xff0c;写个笔记记录下 但是输出时间可能不稳&#xff0c;有待进一步优化 import cv2 import time import os# 创建一个保存图像的文件夹 output_folder "camera_images" if not os.path.exists(output_folder):os.makedirs(output_folder…

(Nginx)基于Nginx+PHP 驱动 Web 应用(上):配置文件与虚拟主机篇

1.应用场景 主要用于学习基于 Nginx PHP 驱动 Web 应用&#xff08;上&#xff09;&#xff1a; 配置文件与虚拟主机篇&#xff0c;学习弄清楚Nginx的常规操作&#xff0c;之前困惑的地方。 本文主要介绍了基于NginxPHP驱动Web应用的配置方法&#xff0c;重点讲解了Nginx配置…

【golang长途旅行第34站】网络编程

网络编程 基本介绍核心主题&#xff1a;​​ Golang面向大规模后端服务程序的设计目标中&#xff0c;网络通信是必不可少且至关重要的部分。​两种网络编程方式&#xff1a;​​​TCP Socket编程​ •性质&#xff1a;网络编程的主流 •底层协议&#xff1a;基于TCP/IP协议 •举…

Hadoop(六)

目录&#xff1a;1.Hadoop概述2.为什么需要分布式存储3.分布式的基础架构分析4.HDFS的基础架构1.Hadoop概述2.为什么需要分布式存储3.分布式的基础架构分析4.HDFS的基础架构

Oracle 12g安装

1. 下载地址 官方网站 一般这种导向的进入的都是oracle的官方网站(先登录&#xff0c;如果没有就创建账号)&#xff0c;并没有真实的12g供你下载。需要你转入Oracle的云中下载&#xff1a;https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 。我选择的是12.1.0.2.0下…

ros2--service/服务--接口

获取service名称const char *get_service_name() const;std::string client_name client_->get_service_name();RCLCPP_INFO(this->get_logger(), "Client name: %s", client_name.c_str());

安卓开发---SimpleAdapter

概念&#xff1a;SimpleAdapter 是 Android 中比 ArrayAdapter 更强大的适配器&#xff0c;用于将复杂的数据绑定到复杂的布局&#xff0c;支持将 Map 中的数据映射到布局中的多个 View。方法签名&#xff1a;public SimpleAdapter( Context context, //上下文 List<? exte…

软考-系统架构设计师 办公自动化系统(OAS)详细讲解

个人博客&#xff1a;blogs.wurp.top 一、OAS的核心概念与演进 1. 什么是OAS&#xff1f; OAS是一个综合性的信息系统&#xff0c;它利用计算机技术、通信技术、系统科学和行为科学&#xff0c;为组织的日常办公事务、信息管理和协同工作提供支持。其本质是将传统办公流程电…

leetcode 155 官方golang标准答案错误

真是误人子弟&#xff0c;leetcode155题官网的golang答案是错误的。push方法的append操作&#xff0c;必然不能保证是o(1)的时间复杂度。就这还是官网的标准答案&#xff0c;就这水平&#xff0c;&#x1f604;leetcode误人子弟不是第一次了。光会刷算法&#xff0c;可惜水平还…

开源 python 应用 开发(十三)AI应用--百度智能云TTS语音合成

最近有个项目需要做视觉自动化处理的工具&#xff0c;最后选用的软件为python&#xff0c;刚好这个机会进行系统学习。短时间学习&#xff0c;需要快速开发&#xff0c;所以记录要点步骤&#xff0c;防止忘记。 链接&#xff1a; 开源 python 应用 开发&#xff08;一&#xf…

大白话说 AI 编程 Trae,小白进!

大家好&#xff0c;我是樱木。 一些小白用户&#xff0c;打开字节出的 AI 编程工具 Trae 时&#xff0c;可能觉得还是有点生疏&#xff0c;但是作为程序员&#xff0c;看到这样的界面分布&#xff0c;已经是在熟悉不过了&#xff0c;甚至心中窃喜&#xff0c;长得和 IDEA 等开…

主流国产数据库:文档完备性

官方文档通常是用户获取数据库产品相关信息最权威的渠道&#xff0c;文档的完备性&#xff08;准确、全面、易用&#xff09;直接影响着开发者的学习成本、项目实施的效率以及后期的运维便利性。 例如&#xff0c;Oracle 数据库的官方文档被广泛认为是行业的黄金标准&#xff…

现今流行的操作系统及其应用场景

2025 年主流操作系统及其应用场景&#xff0c;结合技术趋势与行业实践&#xff0c;涵盖从个人设备到关键基础设施的全场景覆盖&#xff1a;一、桌面与生产力领域1. Windows 11/12&#xff08;微软&#xff09;市场地位&#xff1a;全球桌面市场占比 71%&#xff0c;企业级场景市…

IP v 6

相关概念地址长度128bit&#xff0c;采用冒号划分为8段&#xff0c;并用16进制标识&#xff0c;其容量大到能为地球上的每一粒沙子分配一个地址&#xff0c;通常情况下其网络前缀为64位&#xff0c;接口标识为64位&#xff0c;依照写法可分为首选格式&#xff0c;即完整书写&am…

Elasticsearch冷热架构:性能与成本完美平衡

Elasticsearch 的冷热架构&#xff08;Hot-Warm-Cold Architecture&#xff09;是一种针对时序数据&#xff08;如日志、指标等&#xff09;的成本与性能优化方案&#xff0c;通过将数据在不同生命周期的存储需求分层处理&#xff0c;兼顾性能、容量和成本。其核心思想是&#…

【MFC自动生成的文件详解:YoloClassMFC.cpp 的逐行解释、作用及是否能删除】

大家好&#xff0c;欢迎来到我的MFC编程入门系列。上次我们聊了MFC项目创建后的核心文件区别&#xff08;项目名.cpp、.h、Dlg.cpp 和 Dlg.h&#xff09;&#xff0c;今天针对读者的反馈&#xff0c;专门来拆解其中最重要的一个文件&#xff1a;项目名.cpp&#xff08;这里以用…

玄机靶场 | 冰蝎3.0-jsp流量分析

文章目录一、冰蝎3.0流量特征二、索引三、题目列表步骤#1黑客IP是什么&#xff1f;步骤#2黑客上传的Webshell名是什么&#xff1f;步骤#3黑客上传WebShell的时间是多少&#xff1f;&#xff08;格式如&#xff1a;flag{YYYY-MM-DD HH:MM:SS}&#xff09;步骤#4木马的解密key是什…

基于物理信息神经网络(Physics-Informed Neural Network, PINN)的三维热传导方程求解器MATLAB

代码实现了一个基于物理信息神经网络&#xff08;Physics-Informed Neural Network, PINN&#xff09;的三维热传导方程求解器。以下是详细分析&#xff1a;&#x1f9e0; 一、主要功能 main.m&#xff1a; 构建一个全连接神经网络用于近似三维热传导方程的解 ( u(x, y, z, t) …

按钮计数器:jQuery / AngularJS / Vue / React / dagger.js 实现对比与技术解读

代码来源&#xff1a;https://codepen.io/dagger8224/pen/myeKgVQ 任务&#xff1a;实现“按钮点击 1”计数器&#xff0c;对比不同框架的写法与特性&#xff0c;并给出选型建议。 目录 代码解读&#xff08;逐框架&#xff09; jQuery&#xff08;命令式 DOM&#xff09;Angu…

useEffect中直接使用 await报错

在 useEffect 中直接使用 await 会报错&#xff0c;因为 useEffect 的回调函数不能是 async 函数。有几种正确的方式来处理异步操作&#xff1a; 方法一&#xff1a;在 useEffect 内部创建 async 函数并立即调用 这是最常用的方式。 import React, { useEffect } from react;co…