欢迎光临
我们一直在努力

LIST手术是什么Redis中List篇 ~ 通俗易懂版!!

        Redis List(列表)是一种有序、可重复的字符串集合,底层基于双向链表实现(少量元素时用压缩列表优化),支持从两端高效操作数据,常用于实现队列、栈、消息队列、最新消息列表等场景。其核心优势是:两端插入 / 删除时间复杂度 O (1),按索引访问 O (n),适合高频增删、低频随机访问的场景。​

        LPUSH key value1 [value2…]:从列表左侧(头部) 插入一个或多个元素,返回插入后列表长度。​

示例:LPUSH fruits apple banana orange → 返回 3,列表变为 [orange, banana, apple](左侧插入是 “头插法”,新元素在前)。​

场景:实现栈(先进后出)、消息队列的 “逆序插入”。​

        RPUSH key value1 [value2…]:从列表右侧(尾部) 插入一个或多个元素,返回插入后列表长度。

示例:RPUSH fruits grape mango → 返回 5,列表变为 [orange, banana, apple, grape, mango](尾部插入是 “尾插法”,新元素在后)。​

场景:实现队列(先进先出)、正常顺序的消息存储。​

        LPOP key:删除并返回列表左侧第一个元素,列表为空时返回 nil。​

示例:LPOP fruits → 返回 orange,列表变为 [banana, apple, grape, mango]。​

场景:栈的 “出栈”、队列的 “出队”。​

        RPOP key:删除并返回列表右侧最后一个元素,列表为空时返回 nil。​

示例:RPOP fruits → 返回 mango,列表变为 [banana, apple, grape]。​

        LREM key count value:删除列表中与 value 相等的元素,count 控制删除规则:​

count > 0:从左侧开始,删除最多 count 个匹配元素。​

count < 0:从右侧开始,删除最多 abs(count) 个匹配元素。​

count = 0:删除所有匹配元素。​

示例:LREM fruits 1 apple → 删除左侧 1 个 “apple”,返回删除数量 1。​

        LRANGE key start end:返回列表中从 start 到 end 的所有元素(闭区间),支持负索引(-1 表示最后一个元素,-2 表示倒数第二个)。

示例:LRANGE fruits 0 -1 → 返回列表所有元素 [banana, grape];LRANGE fruits 0 0 → 返回第一个元素 [banana]。​

场景:分页查询列表数据(如 “查询最新 10 条消息” 用 LRANGE key 0 9)。​

        LINDEX key index:返回列表中指定索引 index 的元素,索引从 0 开始,负索引有效,不存在时返回 nil。​

示例:LINDEX fruits 1 → 返回 grape;LINDEX fruits -1 → 返回 grape。​

注意:索引越大,查询效率越低(O (n)),避免高频使用大索引查询。​

        LLEN key:返回列表的长度,列表不存在时返回 0。​

示例:LLEN fruits → 返回 2。​

        LSET key index value:将列表中 index 位置的元素改为 value,索引不存在时报错。​

示例:LSET fruits 0 pear → 列表变为 [pear, grape]。​

场景:更新列表中指定位置的元素(如修改消息内容)。​

        BLPOP key1 [key2…] timeout:阻塞式从多个列表的左侧弹出元素,若所有列表为空,则阻塞timeout 秒(timeout=0 表示永久阻塞),直到有元素可弹出或超时。​

        BRPOP key1 [key2…] timeout:与 BLPOP 类似,从右侧弹出元素。​示例:BRPOP msg_queue 0 → 阻塞等待 msg_queue 列表有元素,一旦有元素插入,立即弹出并返回。

场景:实现分布式消息队列(避免轮询空列表,减少资源浪费)、任务队列(多个消费者阻塞获取任务)。​

        LTRIM key start end:保留列表中 start 到 end 的元素,删除其他元素(相当于 “裁剪” 列表)。​

示例:LTRIM fruits 0 0 → 列表只保留第一个元素 [pear]。​

场景:限制列表长度(如 “只保留最新 50 条日志”,插入后执行 LTRIM key 0 49)。​

        LINSERT key BEFORE|AFTER pivot value:在列表中找到第一个与 pivot 相等的元素,在其前面(BEFORE) 或后面(AFTER) 插入 value,返回插入后列表长度;未找到 pivot 则返回 -1。​

示例:LINSERT fruits AFTER pear cherry → 列表变为 [pear, cherry, grape]。​

场景:在指定元素附近插入数据(如在某个消息后追加回复)。​

        RPOPLPUSH source destination:将 source 列表的右侧元素弹出,插入到 destination 列表的左侧,返回该元素。​

示例:RPOPLPUSH fruits backup → 弹出 grape 插入 backup,fruits 变为 [pear, cherry],backup 变为 [grape]。​

        BRPOPLPUSH source destination timeout:阻塞式版本,source 为空时阻塞,其他逻辑与 RPOPLPUSH 一致。​

场景:实现可靠消息队列(消费者获取消息后先转移到备份列表,处理完成后再删除备份,避免消息丢失)。​

  1. 队列(先进先出):RPUSH 入队,LPOP 出队(非阻塞)或 BRPOP 出队(阻塞)。​
  2. 栈(先进后出):LPUSH 入栈,LPOP 出栈。​
  3. 最新消息列表:RPUSH 插入消息,LTRIM 限制长度,LRANGE 查询最新 N 条。​
  4. 可靠消息队列:RPUSH 生产消息,BRPOPLPUSH 消费消息,处理完成后删除备份列表元素。​
  5. 分页查询:LRANGE key start end 实现分页(适合小规模列表,大规模建议用 Redis 有序集合或数据库)。​

        列表是双向链表,两端操作高效,但中间插入 / 删除 / 查询(按索引)效率低(O (n)),避免频繁操作中间元素。​

        列表长度不宜过大(建议控制在 1 万以内),否则会导致查询和删除效率下降,可拆分多个列表或使用其他数据结构(如 Hash)。​

        阻塞命令(BLPOP/BRPOP/BRPOPLPUSH)会占用客户端连接,避免设置过长的超时时间,防止连接耗尽。​

        Redis List 的核心价值在于 “两端高效操作”,所有命令设计均围绕这一特性展开:​

        基础操作优先用 LPUSH/RPUSH(增)、LPOP/RPOP(删)、LRANGE(查),覆盖 80% 日常场景;​

        进阶场景按需选:阻塞用 BLPOP/BRPOP,限制长度用 LTRIM,可靠消息用 BRPOPLPUSH;​

        避坑关键:少用中间操作(如大索引的 LINDEX、LINSERT),控制列表长度,合理设置阻塞超时。​

        掌握这些命令后,无论是实现简单的栈 / 队列,还是复杂的分布式消息队列,Redis List 都能成为高效的工具。​

        如果这篇文章帮你理清了 Redis List 命令的用法,不妨点赞 + 收藏,方便后续回顾~若你在实际使用中遇到特殊场景(比如列表与其他数据结构的选型纠结),或者有命令用法的疑问,欢迎在评论区留言交流,我会逐一回复!你的支持是我持续分享技术干货的最大动力~​

赞(0)
未经允许不得转载:上海聚慕医疗器械有限公司 » LIST手术是什么Redis中List篇 ~ 通俗易懂版!!

登录

找回密码

注册