在 Redis 里,List 是最容易上手的数据结构之一,但很多人刚接触时只记住了“像数组”,没真正弄清头插、尾插、范围读取和按索引修改各自适合什么场景。下面就按实际操作顺序梳理 List 的常用命令,并结合返回结果说明它的顺序规则、索引写法以及哪些情况下会直接报错,读完就能判断该用哪条命令处理列表数据。
Redis List 是什么,能存多少数据
List 就是一组按顺序排列的数据集合,可以理解成编程语言里的数组或线性列表。它会保留元素的插入顺序,而且既支持从头部插入,也支持从尾部插入。
在 Redis 中,一个列表最多可以包含 2 的 32 次方 - 1 个元素,也就是 4294967295 个。
LPUSH 和 RPUSH:从头部或尾部插入元素
LPUSH 用来把一个或多个元素插入到列表头部;如果列表对应的 key 不存在,Redis 会自动创建这个列表。

向列表中插入单个元素:
127.0.0.1:6379> LPUSH cities beijing
(integer) 1
向同一个列表头部继续插入多个元素:
127.0.0.1:6379> LPUSH cities shanghai shenzheng
(integer) 3
这里返回的整数表示当前列表长度。由于是从头部插入,后写入的元素会排在更前面。
RPUSH 则与之相反,它会把元素追加到列表尾部;如果 key 不存在,同样会自动创建。
127.0.0.1:6379> RPUSH cities guangzhou
(integer) 4
执行完上面的几条命令后,列表内部顺序已经不是最早理解的“插入即简单追加”,而是同时受头插和尾插影响。后面用 LRANGE 查看时,这个顺序会很直观地体现出来。
LRANGE、LINDEX:怎么按范围或按索引取值
LRANGE 用来读取列表中某个范围内的元素,使用时要带上开始索引和结束索引。

例如,获取前 3 个元素:
127.0.0.1:6379> LRANGE cities 0 2
1) "shenzheng"
2) "shanghai"
3) "beijing"
从这个结果可以看出,前面两次 LPUSH 的元素排在列表前部,而通过 RPUSH 加进去的 guangzhou 会留在尾部。
List 的索引从 0 开始:0 表示第一个元素,1 表示第二个元素。它也支持负数索引,其中 -1 表示最后一个元素,-2 表示倒数第二个元素。
因此,读取整个列表时,最常见的写法就是从 0 到 -1:
127.0.0.1:6379> LRANGE cities 0 -1
1) "shenzheng"
2) "shanghai"
3) "beijing"
4) "guangzhou"
如果只想取某一个位置上的值,就不必再用范围查询,而是直接使用 LINDEX。
127.0.0.1:6379> LINDEX cities 2
"wuhan"
LINDEX 适合在你已经明确目标位置时读取单个元素,语义也更直接。
LSET、LPOP、RPOP:修改指定位置,或从两端弹出元素
如果需要通过索引修改列表中的某个元素,可以使用 LSET。比如把第 3 个元素改成 wuhan:
127.0.0.1:6379> LSET cities 2 wuhan
OK
127.0.0.1:6379> LRANGE cities 0 -1
1) "shenzheng"
2) "shanghai"
3) "wuhan"
4) "guangzhou"
这里的 2 仍然是从 0 开始计算的索引,也就是第三个元素。
需要注意的是,LSET 并不是“想改哪里就改哪里”。如果指定索引超出列表范围,Redis 会返回错误;如果对一个空列表执行 LSET,同样会报错。
删除并返回元素时,List 主要看两端操作:
从头部移除并返回第一个元素,使用 LPOP:
127.0.0.1:6379> LPOP cities
"shenzheng"
从尾部移除并返回最后一个元素,使用 RPOP:
127.0.0.1:6379> RPOP cities
"guangzhou"
127.0.0.1:6379> LRANGE cities 0 -1
1) "shanghai"
2) "wuhan"
经过一次 LPOP 和一次 RPOP 之后,列表只剩下中间的两个元素。这类双端操作也是 Redis List 在消息队列、待处理任务列表等场景中很常见的原因。
除了这些高频命令,还能看哪些列表操作
上面几条已经覆盖了 List 最常见的增、查、改、弹出操作。除此之外,Redis 还提供了其他列表命令,例如 LLEN、LREM、LINSERT 等。
如果要进一步查完整命令说明,可以查看 Redis 官方文档:













