List 列表类型
掌握 List 类型的特点与常用命令
理解双向链表结构的特性
能实现队列、栈、排行榜等场景
核心讲解
List 是双向链表结构,有序、可重复,两边都可以插入删除,类似数据结构里的链表。
(1)核心特点
有序,按插入顺序排列
两端操作快,中间操作慢
可以包含重复元素
支持按下标访问
(2)常用命令
表格
命令 | 功能 |
|---|---|
| 左边(头部)插入元素 |
| 右边(尾部)插入元素 |
| 左边弹出一个元素 |
| 右边弹出一个元素 |
| 按范围获取元素,0 开始,-1 最后一个 |
| 获取指定位置的元素 |
| 列表长度 |
| 删除指定个数的匹配元素 |
| 截取保留指定范围,其余删除 |
| 从源右边弹出,插入目标左边 |
(3)适用场景
消息队列:LPUSH + RPOP 实现队列,先进先出
栈:LPUSH + LPOP 实现栈,先进后出
最新列表:文章列表、评论列表、消息列表,保留最新 N 条
数据分页
操作示例
# ===== 插入 =====
# 右边插入,模拟队列
RPUSH msg_list msg1 msg2 msg3
# 左边插入
LPUSH msg_list msg0
# ===== 查看 =====
# 查看所有
LRANGE msg_list 0 -1
# msg0 msg1 msg2 msg3
# 查看前3个
LRANGE msg_list 0 2
# 长度
LLEN msg_list
# ===== 弹出 =====
# 左边弹出
LPOP msg_list
# msg0
# 右边弹出
RPOP msg_list
# msg3
# ===== 常用操作 =====
# 获取指定位置
LINDEX msg_list 0
# 删除指定值
LREM msg_list 1 msg2
# 只保留最新的5条
LTRIM msg_list 0 4
# ===== 栈实现 =====
LPUSH stack a b c
LPOP stack
# c,后进先出
# ===== 简单消息队列 =====
# 生产者:LPUSH任务
LPUSH task_queue task1 task2 task3
# 消费者:RPOP获取任务
RPOP task_queue
常见误区
用 List 做消息队列很完美:List 没有确认机制、没有消费组,消息丢了就没了,简单场景用,复杂用 MQ 或者 Stream
频繁中间插入删除:List 是链表,中间操作很慢,尽量只在两端操作
LRANGE 0 -1 随便用:列表很长的时候,全量取出很耗性能,分页取
列表无限增长:不停往 List 加数据不清理,会越来越大,定期 LTRIM 或者弹出
课后练习
用 List 实现一个简单的消息队列,生产者发 3 条消息,消费者消费
实现一个栈,压入 3 个元素,依次弹出
实现保留最新 10 条的评论列表
思考:List 和数组的区别是什么?

