Redis List 列表类型详解:从入门到实践

发布时间:2026/6/27 17:23:11
Redis List 列表类型详解:从入门到实践 1. 为什么需要 List在 Redis 的五大基本类型中List列表是用来存储有序的、可重复的字符串集合。它和 Java 中的LinkedList或 Python 中的list类似但 Redis 的 List 是经过特殊设计的能在头部和尾部进行高效的操作。典型场景消息队列生产者/消费者最新消息列表比如微博时间线栈后进先出或队列先进先出List 的有序性体现在每个元素都有一个下标索引从 0 开始计数也可以负数表示倒数第几个你可以通过索引访问任意位置的元素。2. List 的核心概念元素有序插入顺序决定了元素的存储顺序。元素可重复同一个值可以出现多次。双向操作从左边头部或右边尾部插入/弹出元素都非常快O(1)。支持索引访问通过LINDEX或LRANGE获取指定范围的元素。一个 List 最多可以容纳2^32 - 1约 42 亿个元素绝大多数场景够用了。3. 常用命令详解我们从最基础的「增删改查」开始一步步深入。3.1 插入元素LPUSH – 从左侧插入头插LPUSH key element [element ...]将一个或多个元素从左边插入列表可以理解为“头插”。返回插入后列表的长度。时间复杂度 O(N)N 为插入元素个数但对于单个元素是 O(1)。所以多次 LPUSH 后列表是“后来的在前”。RPUSH – 从右侧插入尾插RPUSH key element [element ...]从右边插入尾插同样返回新长度。LPUSHX / RPUSHX – 仅当 key 存在时插入这两个命令与LPUSH/RPUSH类似但只在 key 已存在时执行如果 key 不存在则什么也不做3.2 弹出元素LPOP – 从左侧弹出头删LPOP key移除并返回列表最左边的元素头元素。如果列表为空返回nil。RPOP – 从右侧弹出尾删RPOP – 从右侧弹出尾删移除并返回最右边的元素。LPOP和RPOP都是 O(1) 操作非常高效。3.3 获取范围/索引LRANGE – 获取指定范围的元素LRANGE key start stop返回从start到stop的所有元素闭区间包含两端。start/stop支持负数索引-1 代表最后一个元素-2 代表倒数第二个以此类推。如果start大于实际长度返回空列表如果stop超出范围只返回存在的部分。注意LRANGE的时间复杂度是 O(N)N 是返回的元素个数。对于大列表不建议取太大的范围。LINDEX – 获取指定索引位置的元素LINDEX key index返回索引index处的元素支持负数-1 为最后一个。如果索引超出范围返回nil。3.4 获取列表长度LLENLLEN key返回列表的长度元素个数。O(1) 操作。3.5 删除元素LREM – 移除指定个数的特定元素LREM key count element从列表中移除前count个值为element的元素。count 0从左向右移除最多count个。count 0从右向左移除最多|count|个。count 0移除所有值为element的元素。返回实际移除的个数。注意LREM的时间复杂度为 O(N)N 是列表长度因为它需要遍历。3.6 插入到指定元素前后LINSERT – 在某个元素前/后插入LINSERT key BEFORE|AFTER pivot element在列表中在第一个值为pivot的元素之前或之后插入element。如果pivot不存在则返回 -1 且不做插入。返回插入后列表的长度。3.7 设置指定索引的值LSET – 修改指定位置的元素LSET key index value将索引index处的元素设置为value。如果索引超出范围返回错误。O(N) 操作N 为列表长度因为底层可能是链表。3.8 修剪列表LTRIM – 只保留指定范围的元素LTRIM key start stop保留[start, stop]范围内的元素其余全部删除。可以用于限制列表大小比如只保留最近 100 条消息。4. 阻塞版本命令Redis 提供了阻塞式的弹出命令BLPOP和BRPOP。BLPOP / BRPOPBLPOP key [key ...] timeout BRPOP key [key ...] timeout如果指定的列表中至少有一个非空则立即从左/右弹出第一个元素类似LPOP/RPOP。如果所有列表都为空则阻塞等待直到有元素可弹或超时。timeout为超时时间秒如果设为0表示永远阻塞。支持检查多个 key从左到右扫描哪个 key 有元素就弹出哪个。使用场景生产者-消费者模式。生产者RPUSH元素消费者BLPOP阻塞等待实现一个简单的消息队列。注意阻塞版本允许多个消费者同时阻塞在同一个队列上当有元素时只有一个消费者能抢到公平竞争。5. 内部编码Redis 的 List 内部实现会根据元素数量和大小自动选择编码ziplist压缩列表当列表元素个数 list-max-ziplist-entries默认 512且所有元素长度 list-max-ziplist-value默认 64 字节时使用。节省内存但读写较大时性能下降。quicklist快速列表从 Redis 3.2 开始list 统一采用quicklist作为内部编码它是一个双向链表每个节点是一个 ziplist兼顾了内存和性能。你可以用OBJECT ENCODING key查看127.0.0.1:6379 OBJECT ENCODING mylist quicklist大多数情况下你无需关心底层编码Redis 会自动优化。

月新闻