深入解析:Redis List 类型全解析

news/2025/10/18 16:18:05/文章来源:https://www.cnblogs.com/lxjshuju/p/19147109

文章目录

  • 1.引言
  • 2.List 类型核心命令
    • 2.1 插入命令:lpush /rpush/lpushx /rpushx
      • 2.1.1 lpush
      • 2.1.2 rpush
      • 2.1.3 lpushx
      • 2.1.4 rpushx
    • 2.2 删除命令
      • 2.2.1 lpop
      • 2.2.2 rpop
      • 2.2.3 blpop /brpop
    • 2.3 查询命令
      • 2.3.1 lrange
      • 2.3.2 lindex
      • 2.3.3 llen
    • 2.4 修改与删除指定元素命令
      • 2.4.1 linsert
      • 2.4.2 lset
      • 2.4.3 lrem
      • 2.4.4 ltrim
  • 3.List 类型的底层编码
  • 4.应用场景
    • 4.1 有序数据存储
    • 4.2 分布式消息队列
      • 分频道的消息队列
    • 4.3 分页
      • 4.3.1 基础实现:基于lrange的分页
      • 4.3.2 核心优化:解决 “中间页查询低效” 疑问
      • 4.3.3 额外优化:减少网络请求次数
    • 4.4 业务视角
  • 5.小结

1.引言

在 Redis 的常用数据类型中,List(列表)是兼顾 “有序性” 与 “灵活性” 的代表 —— 它既可能像数组一样按下标访问元素,也能像双端队列一样高效地从两端插入 / 删除数据,甚至能模拟栈、消息队列等经典数据结构。本文将从 List 的核心特性出发,框架拆解其命令体系、底层编码优化逻辑,以及在实际业务中的典型应用场景,援助你掌握 “如何用 List 解决分布式系统中的有序数据存储与交互困难”。

在这里插入图片描述

2.List 类型核心命令

2.1 插入命令:lpush /rpush/lpushx /rpushx

2.1.1 lpush

lpush key element [element ...]

在这里插入图片描述
在这里插入图片描述

2.1.2 rpush

rpush key element [element ...]

  • 功能:从列表尾部(右侧) 插入 1 个或多个元素;若 Key 不存在,会先创建空列表再插入。
  • 时间复杂度:O(1)。
  • 返回值:插入元素后,列表的总长度。

在这里插入图片描述

2.1.3 lpushx

lpushx key element [element ...]

在这里插入图片描述
在这里插入图片描述

2.1.4 rpushx

rpushx key element [element ...]

  • 功能:仅当 Key已存在时,从列表尾部插入 1 个或多个元素;若 Key 不存在,不执行任何操作。
  • 时间复杂度:O(1)。
  • 返回值:插入元素后列表的总长度(Key 不存在时返回 0)。

2.2 删除命令

2.2.1 lpop

lpop key [count]

  • 机制:从列表头部移除 1 个或count个元素;若 Key 不存在或列表为空,返回nil。
  • 时间复杂度:O (1)
  • 返回值:移除的元素(移除 1 个时返回单个值,移除多个时返回元素列表)。

在这里插入图片描述

2.2.2 rpop

rpop key [count]

在这里插入图片描述
非常高效的O(1)就是redis中的list是一个双端队列,从两头插入删除都

一个队列就是搭配使用lpush(rpush) rpop(lpop)就
搭配应用lpush(rpush) lpop(rpop)就是一个栈

2.2.3 blpop /brpop

blpop key [key ...] timeout

  • 功能:阻塞式从 “第一个非空列表” 的头部移除元素:
    • 若传入多个 Key,按顺序检查每个 Key 对应的列表,找到第一个非空列表并移除头部元素;
    • 若所有列表均为空,阻塞等待timeout秒(timeout=0表示永久阻塞),超时后返回nil。
  • 时间复杂度:O(1)。
  • 返回值:数组形式,第一个元素是 “移除元素所在的 Key”,第二个元素是 “移除的元素”(超时返回nil)。

阻塞队列:
1)如果队列为空,尝试出队列–》阻塞 。 队列不空–》不阻塞
2)如果队列为满,尝试入队列–》阻塞。 队列不满–》不阻塞

1)blpop/brpop可以设置阻塞时间,超时也会停止阻塞。

2)命令也可能同时监听多个key,从左向右遍历,一旦有一个key对应的列表中可以弹出元素,命令立刻返回。

3)多个客户端同时执行pop,则最先执行的客户端得到弹出的元素
在这里插入图片描述

对一个空队列操作:
在这里插入图片描述
先阻塞在那,开另一个客户端对指定队列插入元素,结束阻塞并弹出。

对多个key进行管理:

在这里插入图片描述
brpop与blpop同理

2.3 查询命令

2.3.1 lrange

lrange key start end

  • 作用:获取列表中[start, end]区间的所有元素(闭区间,支持负数下标:-1表示最后一个元素,-2表示倒数第二个,以此类推)。
  • 时间复杂度:O (N)(N 为区间内元素的个数,而非列表总长度)。
  • 返回值:区间内的元素列表(空列表或 Key 不存在时返回空列表)。
  • 关键特性:容错性强,若start或end超出列表范围,会自动调整为管用区间(如列表长度为 5,end=10会自动改为end=4)。

在这里插入图片描述

2.3.2 lindex

lindex key index

在这里插入图片描述

2.3.3 llen

llen key

  • 功能:获取列表的元素总长度。
  • 时间复杂度:O (1)
  • 返回值:列表的元素个数(Key 不存在时返回 0)。

在这里插入图片描述

2.4 修改与删除指定元素命令

2.4.1 linsert

linsert key BEFORE|AFTER pivot element

  • 功能:在列表中 “第一个匹配pivot的元素” 的前面(BEFORE) 或后面(AFTER) 插入element;若列表中无pivot元素,不执行任何操作。
  • 时间复杂度:O (N)
  • 返回值:插入元素后列表的总长度(无pivot时返回-1,Key 不存在时返回0)。

在这里插入图片描述
在这里插入图片描述

2.4.2 lset

lset key index element

在这里插入图片描述

2.4.3 lrem

lrem key count element

  • 功能:删除列表中 “值等于element” 的元素,删除数量由count决定:
    • count > 0:从列表头部到尾部删除count个匹配元素;
    • count < 0:从列表尾部到头部删除count的绝对值个匹配元素;
    • count = 0:删除列表中所有值等于element的元素。
  • 时间复杂度:O (N+M)(N 为列表总长度,M 为删除的元素个数,需遍历列表匹配元素)。
  • 返回值:实际删除的元素总个数(Key 不存在或无匹配元素时返回 0)。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4.4 ltrim

ltrim key start end

在这里插入图片描述

3.List 类型的底层编码

Redis 3.2 版本前,List 的底层编码是 “ziplist(压缩列表)” 和 “linkedlist(双向链表)” 的切换;3.2 版本后,统一为quicklist(敏捷列表) —— 这是 “双向链表 + 压缩列表” 的混合结构,兼顾了内存效率与运行性能。

在这里插入图片描述
每个压缩列表控制大小,不要太大

在这里插入图片描述
在这里插入图片描述

4.应用场景

4.1 有序数据存储

适用于要求 “按插入顺序存储多个元素” 且 “频繁访问两端数据” 的场景,如用户浏览历史、商品评价列表、系统运行日志等 —— 这类场景的核心诉求是 “保留顺序 + 快速增删 + 按需截取”。

在这里插入图片描述
redis如何组织要凭借实际情况决定

4.2 分布式消息队列

List 的lpush(生产者写入)+brpop(消费者阻塞读取)组合,是实现 “轻量级分布式消息队列” 的经典方案,适用于低延迟、低并发的消息传递场景(如订单状态通知、用户注册成功后发送欢迎短信)。

在这里插入图片描述
谁先执行brpop命令,先拿到元素

这样的设定,就能构成一个 “轮询” 式的效果。
按执行命令的顺序依次获取元素,如果一个消费者想多次消费,再次执行的命令排在前面已有的命令之后,达到轮流获取(轮询)的效果。

分频道的消息队列

在这里插入图片描述
当业务场景中存在多种消息类型(如电商平台的 “订单消息”“库存消息”“物流消息”),若所有消息都放入一个 List,会导致 “消息混杂、处理效率低、某类消息异常影响全局”。此时可利用 “分频道” 优化 —— 为每种消息类型创建独立的 List,达成 “消息隔离、解耦业务”。

比如在抖音上刷视频:
通过一个频道,来传输视频材料
另一个频道,传输弹幕
另一个频道,传输 评论 素材

通过搞成多个频道,就能够在某种资料发送问题的时候,不会对其他数据造成影响(解耦合)

4.3 分页

当 List 中存储的元素数量过大(如微博用户发表的 1 万条文章),无法一次性在前端展示,需完成 “分页加载”—— 用户点击 “下一页” 时,加载对应页的内容。List 的lrange命令可直接支持分页,但需注意优化 “中间页查询效率”。

4.3.1 基础实现:基于lrange的分页

假设每页展示 10 条文章,分页逻辑如下:

  • 第 1 页(首页):调用lrange user:articles:10086 0 9—— 获取列表第 0 到 9 个元素(最新的 10
    条文章);
  • 第 2 页:调用lrange user:articles:10086 10 19—— 获取第 10 到 19 个元素;
  • 第 N 页:调用lrange user:articles:10086 (N-1)10 N10-1—— 按公式计算区间。

同时,调用llen user:articles:10086获取总元素个数,计算总页数。

4.3.2 核心优化:解决 “中间页查询低效” 挑战

List 的底层是链表结构,lrange查询中间页(如第 500 页)时,需从列表头部遍历到第 4990 个元素,时间复杂度为 O (N),随着页数增加,查询速度会明显变慢。针对这一困难,可采用 “列表拆分” 优化 —— 将大列表拆分为多个小列表,降低单列表长度。

以 “存储 1 万条文章” 为例,优化方案如下:

  1. 拆分小列表:按 “每页 10 条” 的粒度,将 1 万条文章拆分为 1000 个小列表,命名规则为user:articles:10086:page:1(第 1 页,存储前 10条)、user:articles:10086:page:2(第 2 页,存储 11-20条)、 user:articles:10086:page:1000(第 1000 页,存储 9991-10000 条);
  2. 分页查询:用户访问第 500 页时,直接调用lrange user:articles:10086:page:500 0 9—— 无需遍历大列表,直接查询对应小列表,时间复杂度降至 O (1);
  3. 新增文章处理:用户发表新文章时,调用lpush user:articles:10086:page:1 新文章ID—— 插入第 1
    页小列表;若第 1 页元素超过 10 条(如第 1 页已有 10 条,插入后变为 11 条),则将第 1 页的最后 1 条元素移到第 2页的头部(rpop user:articles:10086:page:1 + lpush user:articles:10086:page:2 元素ID),确保每个小列表不超过 10 条。

4.3.3 额外优化:减少网络请求次数

基础分页中,查询 “某页文章详情” 时,需先调用lrange获取该页的文章 ID 列表,再循环调用hgetall 文章ID获取每个文章的标题、内容等详情 —— 若每页 10 条文章,需 1 次lrange+10 次hgetall,共 11 次网络请求,效率较低。
可通过Redis Pipeline(流水线/管道) 优化:将 “1 次lrange+10 次hgetall” 的 11 次请求合并为 1 次请求发送给 Redis,Redis 批量处理后一次性返回结果,大幅减少网络通信次数(从 11 次降至 1 次),提升查询效率。

4.4 业务视角

List 核心特性对应的业务诉求典型场景
两端插入 / 删除高效(O (1))高频增删、需保留顺序(先进先出 / 先进后出)消息队列、浏览历史、栈
支持阻塞读取(brpop/blpop)避免轮询空列表、降低资源浪费消费者监听消息队列
支持区间截取(ltrim/lrange)需保留最新 N 条数据、分页展示操作日志、分页文章
元素可重复允许存储相同内容的多条数据重复消息通知、多次浏览记录

5.小结

Redis List 类型的核心价值在于 “有序性 + 灵活性”—— 它既满足了 “按插入顺序存储” 的基础需求,又通过双端操作、阻塞读取等特性,适配了消息队列、分页等艰难场景,是分布式系统中 “有序信息交互” 的重点工具。

使用 List 类型时,需牢记三个关键建议:

  1. 优先操作两端:尽量用lpush/rpush(插入)、lpop/rpop(删除)等两端操作(O (1)),避免lindex/linsert等中间操作(O (N)),减少性能损耗;
  2. 合理拆分大列表:当列表元素超过 1 万条时,采用 “小列表拆分” 优化,避免lrange查询中间页效率低的问题;
  3. 消息队列需兜底:用 List 实现消息队列时,必须添加 “备份队列” 或 “消息重试” 逻辑,避免消息丢失,同时监控队列长度,防止内存溢出。

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

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

相关文章

内外网文件传输工具有哪些?最强合集在这里

内外网文件传输工具有很多,传统的、专业的、免费的、付费的,等等,那么,具体到底有哪些内外网文件传输工具呢?各有什么特点呢?企业要入选选择呢? 本文中,就来揭晓答案,大合集就在这篇文章里了! 第一类:物理隔…

IC 测试革新

无论你是 IC 设计新手,还是资深 RTL Synthesis 工程师,深入掌握设计可测试性(DFT)关键技术,是提升芯片可靠性的必经之路。 1、为什么 DFT 在现代 IC 中变得不可或缺提升可控性与可观测性:通过在设计中嵌入测试结…

2025 年自动售卖机厂家最新推荐榜单:智能 / 无人 / 文创 / 盲盒 / 食品全品类优选,高性价比品牌选购指南

引言智能零售浪潮下,自动售卖机行业加速扩张,但市场乱象让运营商陷入选型困境:设备卡货、温控失效、后台卡顿等问题频发,部分品牌缺乏核心技术,智能化与售后服务严重脱节。随着消费需求升级,具备高清触控、多支付…

DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(二)

DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(二)DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程…

使用SecureCRT从linux上传下载文件方法

​​一、从 Linux 服务器打包并用 CRT 下载到 Windows 的完整流程​​ 1、准备工作​​ 在 Linux 服务器安装打包工具与 lrzsz(lrzsz 用于 ZModem 快速直传): RHEL/CentOS: sudo yum install -y ​​lrzsz​​ ​​…

2025年保洁公司权威推荐榜:苏州/昆山驻场保洁/钟点保洁/开荒保洁/外包保洁/商场保洁/办公楼保洁/工厂保洁/医院保洁/企业保洁全方位解析

行业背景与发展趋势随着城市化进程加速和现代服务业蓬勃发展,专业保洁服务已成为各类场所不可或缺的基础需求。从传统的驻场保洁、钟点保洁到专业度要求更高的开荒保洁、医院保洁,保洁行业正朝着专业化、标准化、智能…

用delegate 和event实现事件(有参和无参,有返回值和无返回值)

用delegate 和event实现事件(有参和无参,有返回值和无返回值)using System; using System.Windows.Forms; namespace 委托与事件 { public partial class Form1 : Form { //1、声明委托 public delegate void Conne…

2025年完整指南:PaddleOCR-VL-0.9B — 百度超轻量级文档解析利器

2025年完整指南:PaddleOCR-VL-0.9B — 百度超轻量级文档解析利器🎯 核心要点(TL;DR)突破性成就:仅0.9B参数的模型在全球OmniBenchDoc V1.5排行榜上排名第一(综合得分:90.67) 全面领先:超越GPT-4o、Gemini 2.…

有哪些ChatBI产品使用了NL2DSL2SQL的技术路线,其市场成熟度如何?

将自然语言转换为数据库查询的技术(称为 NL2SQL)已从一个新兴概念发展成为成熟且具有商业可行性的解决方案。该领域最重要的架构进步是多阶段代理方法,称为 NL2dsl2sql,它引入了领域特定语言 (DSL) 作为中间表示。…

跨网文件交换系统是什么?解锁企业高效数据传输新姿势

在数字化时代,数据已成为企业核心资产,金融、半导体、能源、政府等行业为保护敏感数据,普遍采用网络隔离技术构建安全“防火墙”。但隔离并非终点,企业仍需在不同网络(如内网与外网、研发网与办公网)间传输财务报…

详细介绍:5、软件工程

详细介绍:5、软件工程2025-10-17 09:41 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

应用安全 --- IDAPro脚本 之 导出所有函数地址

应用安全 --- IDAPro脚本 之 导出所有函数地址import idautils import idc import csvdef export_frida_functions_csv():"""导出适合Frida使用的函数列表"""with open("D:/frida_…

Content Hub接口文档

反馈系统后端接口文档 概述 反馈系统用于收集用户对系统功能的意见、建议和问题反馈,支持用户提交反馈、查看反馈列表、回复反馈等功能。 基础信息Base URL: /api/feedback 数据格式: JSON 字符编码: UTF-8数据结构 反…

Java 序列化详解

Java 序列化详解Java 序列化是将对象的状态转换为可存储或可传输的字节流的过程,而反序列化则是将字节流恢复为原始对象的过程。这一机制是 Java 中对象持久化(如保存到文件)、网络传输(如 RPC 调用)的基础。本文…

2025年防水织带/鞋垫/编织包/松紧带/鞋带/织带/飞织鞋面厂家最新推荐榜单:专业工艺与创新设计深度解析

2025年防水织带/鞋垫/编织包/松紧带/鞋带/织带/飞织鞋面厂家最新推荐榜单:专业工艺与创新设计深度解析随着纺织行业技术革新步伐加快,防水织带、功能性鞋垫、编织包、松紧带、鞋带、织带及飞织鞋面等产品正经历着从传…

2025年方钢/扁钢/圆钢/光轴/六角钢/异型钢/冷拉冷拔钢/热轧钢厂家最新权威推荐榜:Q355B/Q345B/16Mn/45#/40Cr/A3/Q235B钢材实力解析

2025年方钢/扁钢/圆钢/光轴/六角钢/异型钢/冷拉冷拔钢/热轧钢厂家最新权威推荐榜:Q355B/Q345B/16Mn/45#/40Cr/A3/Q235B钢材实力解析在制造业高质量发展的背景下,钢材作为基础工业材料,其质量与性能直接影响着下游产…

NVIDIA Jetson TX2 边缘盒子运行姿态检测模型记录

Jetson TX2系统版本:JetPack 4.6.1 (对应 L4T R32.6.1) 架构:aarch64(ARM 64) CUDA 版本:10.2 python 3.6背景介绍 ​ 最近在做关于视频流处理方面项目,接触到NVIDIA 的边缘盒子,就尝试着看在边缘盒子上能不能运…

2025年电源适配器厂家权威推荐榜:笔记本适配器/工业电源/充电器厂家实力与市场口碑深度解析

2025年电源适配器厂家权威推荐榜:笔记本适配器/工业电源/充电器厂家实力与市场口碑深度解析行业背景与市场现状随着数字化转型进程加速,全球电源适配器市场正迎来新一轮技术变革。据行业数据显示,2025年全球电源适配…

止损,补仓价格的合理设置

设置合适的百分比是一个因人而异、因股而异的艺术,没有一个固定的“万能数字”。它取决于您的交易风格、风险承受能力、股票的波动性(Beta值)和投资期限。 但是,我们可以提供一个基于普遍市场经验和风险控制原则的…