聊聊Redis里List到底怎么用,结构和应用那些事儿
- 问答
- 2025-12-25 02:08:02
- 4
聊到Redis里的List,你可以把它想象成一个“双向排队”的队伍,这个队伍很特别,它既可以从左边进人、左边出人,也可以从右边进人、右边出人,甚至可以从中间插队或者截取一段队伍出来,它和我们编程中常说的“列表”或“数组”有点像,但它在内存中的存储方式更高效,并且提供了一系列非常实用的命令来操作这个“队伍”。
List的底层结构是什么样子的?
Redis的List在底层其实有两种实现方式,但咱们不用纠结太深的技术细节,可以这么理解:
- 当List元素比较少或者每个元素比较小的时候,Redis会用一块连续的内存来存储它们,就像我们排成一个紧密的方阵,这种方式叫“压缩列表”(ziplist),它的好处是节省内存。
- 当List元素变得很多或者某个元素特别大的时候,为了保持操作的效率,Redis会自动把这个“方阵”打散,变成一个“双向链表”(linkedlist),就像本来大家紧挨着站,现在每个人只记住自己前面是谁、后面是谁,然后松散地站着,这样,在中间插入或删除一个人时,就不用麻烦整个队伍移动,只需要改变几个人之间的“记忆”(指针)就行了。
后来Redis还引入了一种更优化的结构叫“quicklist”,你可以理解为它把很多个小块的“压缩列表”用“双向链表”的方式串了起来,取了个折中,既考虑了内存节省,又保证了操作效率,但对我们使用者来说,这些都是Redis自动处理的,我们只需要知道List这个“队伍”很灵活、很高效就行了。
List能用来做什么?实战应用场景
这才是最有意思的部分,Redis List的几种操作方式,直接对应了我们在实际开发中常见的几种需求。
消息队列(最经典的应用)
这是List最广为人知的用途,想象一个发短信的场景:

- 生产者(发送短信的程序)使用
LPUSH命令,把一个个要发送的短信任务(给138xxxx发送验证码1234”)从队伍的左边塞进一个叫“待发送短信”的List里。 - 消费者(处理发送短信的程序)则使用
RPOP命令,从队伍的右边把任务一个个取出来处理。
这样就形成了一个最简单的“先进先出”(FIFO)队列,最早被塞进去的任务,会最后被取出来(因为左边进,右边出),保证了公平性,为了避免消费者不停地用 RPOP 去问“有消息吗?”(空轮询,浪费资源),Redis还提供了 BRPOP 命令,它可以阻塞地等待,直到有消息来了才返回,非常高效。
栈(后进先出)
如果我们把进出的方向统一一下,比如都用左边:LPUSH(左边进) 和 LPOP(左边出),那这个List就变成了一个“栈”,就像一摞盘子,你最后放上去的那个盘子,总是最先被拿走,这种结构在某些需要“回溯”功能的场景下很有用。
动态更新的排行榜或最新列表
比如我们要做一个“最新新闻”页面,只显示最新的100条新闻。

- 每当有一条新闻产生时,我们就用
LPUSH把它加到List的头部。 - 我们可以用
LTRIM命令,这个命令非常关键,它可以修剪List,只保留指定范围内的元素,比如我们执行LTRIM mynewslist 0 99,意思是只保留列表里从第0个到第99个(总共100个)元素,超出的老新闻就被自动删掉了。 - 展示的时候,直接用
LRANGE命令取出最新的0到N条即可。
这样就轻松实现了一个固定长度的、自动淘汰旧内容的列表,性能极高。
充当一个可变长度的数组
List提供了非常丰富的操作命令,让你可以像操作数组一样操作它:
LINDEX:根据下标获取某个位置的元素,就像array[0]。LSET:根据下标修改某个位置的元素。LINSERT:在某个元素的前面或后面插入一个新元素。LLEN:获取列表长度。
虽然这些操作在链表中间进行时效率不如真正的数组高(因为需要遍历),但在很多不那么苛刻的场景下,比如管理一个用户的操作记录列表、一个临时的任务列表等,已经非常方便和实用了。
需要注意的几个小点
- 空List会被自动删除:当一个List里的最后一个元素被弹出后,这个List键本身也会被Redis自动删除,很省心。
- 小心阻塞命令的超时:
BLPOP、BRPOP这类阻塞命令可以设置超时时间,避免客户端永远等下去。 - 不是万能的:虽然List很强大,但它不适合需要根据特定条件查询(比如查询内容包含“error”的消息)的场景,那种情况可能需要用到Redis的Set(集合)或者Sorted Set(有序集合)。
Redis的List是一个功能强大且直观的数据结构,它的核心思想就是“双向队列”,通过组合使用它的 LPUSH/RPUSH、LPOP/RPOP、LTRIM、LRANGE 等命令,我们可以轻松应对消息队列、最新列表、栈等多种业务场景,是Redis里最常用和最实用的数据结构之一。
本文由钊智敏于2025-12-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/67896.html
