Redis命令详解:Lists

Redis命令详解:Lists
最新回答
说不尽的伤ミ

2026-10-29 16:00:22

List是Redis的基础数据类型之一,类似于Java中的LinkedList。列表最多包含2^32个元素,常用于模拟队列操作。下面是List相关命令的详细介绍:

BLPOP

最早版本:2.0.0

时间复杂度:O(1)

用法:BLPOP是LPOP的阻塞版本。当列表无元素可弹出时,连接将被阻塞。当给定多个key,会按参数key的顺序检查各个列表,弹出第一个非空列表的头元素。timeout表示阻塞的最大秒数,timeout为0表示无限阻塞。

当多个元素同时push进一个list时,阻塞的BLPOP命令会弹出哪个元素?在Redis2.4和2.6版本处理方法不同。客户端A阻塞等待,此时客户端B执行push操作。在Redis2.6之后,客户端A会返回c;在Redis2.4版本中,客户端A接收到第一个元素a。

若需等待Set新元素并阻塞队列,可使用BLPOP。伪代码示例如下:

消费者:生产者:

BRPOP

最早版本:2.0.0

时间复杂度:O(1)

BRPOP与BLPOP基本相同,不同之处在于它从尾部弹出元素。

BRPOPLPUSH

最早版本:2.2.0

时间复杂度:O(1)

它是RPOPLPUSH的阻塞版本。当source包含元素时,它与RPOPLPUSH表现相同;当source为空时,Redis会被阻塞,直到另一个客户端push元素或达到timeout时间限制。

LINDEX

最早版本:1.0.0

时间复杂度:O(N),N为找到目标元素所跨越元素的个数。当index为0或-1时,时间复杂度为O(1)。用法:返回列表中指定位置的元素。index从0开始,-1表示倒数第一个元素,-2表示倒数第二个元素等。

LINSERT

最早版本:2.2.0

时间复杂度:O(N),N为在找到基准value前所跨越的元素个数。用法:将value插入到基准值pivot的前面或后面。如果key不存在,则视为空列表。命令返回插入操作后的list长度,若找不到基准值pivot,返回-1。

LLEN

最早版本:1.0.0

时间复杂度:O(1)

返回指定key的list长度。如果key不存在,则视为空列表,返回0。如果key非list类型,会报错。

LPOP

最早版本:1.0.0

时间复杂度:O(1)

删除并返回list的第一个元素。如果key不存在,返回nil。

LPUSH

最早版本:1.0.0

时间复杂度:O(1)

将所有指定的value插入列表头部。如果key不存在,则创建空list并进行插入。如果key非list类型,会报错。一次可插入多个元素,顺序从左到右。

LPUSHX

最早版本:2.2.0

时间复杂度:O(1)

当key存在时,在头部插入指定元素。若key不存在,则不进行操作。

LRANGE

最早版本:1.0.0

时间复杂度:O(S+N),S为start元素的偏移量,N为指定范围的元素个数。用法:返回指定key的指定范围元素。start和stop为下标(从0开始),可以是负数。结果包含下标为stop的元素。start或stop超出范围返回空列表。

LREM

最早版本:1.0.0

时间复杂度:O(1)

移除list中前count次出现的value。key不存在视为空列表,返回0。

LSET

最早版本:1.0.0

时间复杂度:O(N),N为list的长度。用法:设置指定下标的value。下标超出范围会报错。

LTRIM

最早版本:1.0.0

时间复杂度:O(N),N为删除的元素个数。用法:修剪已存在的list,修剪后的list只包含指定范围的元素。start和stop为从0开始的索引。start和stop可以是负数。若超出范围,不会报错,根据实际参数处理。

RPOP

最早版本:1.0.0

时间复杂度:O(1)

删除并返回list的最后一个元素。key不存在返回nil。

RPOPLPUSH

最早版本:1.2.0

时间复杂度:O(1)

原子性地返回并删除source的最后一个元素,并将该元素存储到destination的第一个元素位置。例如,source保存a、b、c,destination保存x、y、z,执行后,source保存a、b,destination保存c、x、y、z。返回被移出和存入destination的元素。

RPUSH

最早版本:1.0.0

时间复杂度:O(1)

将指定元素插入到指定key的尾部。key不存在则创建空list。key非list类型会报错。在2.4版本之后,可一次插入多个值,顺序从左到右。

RPUSHX

最早版本:2.2.0

时间复杂度:O(1)

若key不存在,则不会进行任何操作,与RPUSH不同。