Redis常见面试题——List对象
当然可以!这里我帮你整理了一份【Redis中 List 结构】相关的高频面试题,并附上简明回答:
📚 Redis List 结构面试题(高频总结版)
1. Redis 中的 List 是什么?底层是什么实现的?
答:
- Redis 的 List 是双向链表(早期直接是
quicklist
之前是ziplist
或linkedlist
)。 - 具体底层:
- 小数据量时(元素少、元素小):使用 压缩列表(ziplist) 节省空间。
- 大数据量时(元素多、元素大):使用 quicklist,本质是多个 ziplist 组成的双向链表。
✅ quicklist = 多个 ziplist + 双向链表指针连接
2. List 常用命令有哪些?
答:
命令 | 说明 |
---|---|
LPUSH key value [value …] | 从左插入元素 |
RPUSH key value [value …] | 从右插入元素 |
LPOP key | 从左弹出元素 |
RPOP key | 从右弹出元素 |
LRANGE key start stop | 获取列表中的指定范围元素 |
LINDEX key index | 获取指定下标的元素 |
LLEN key | 获取列表长度 |
LREM key count value | 移除列表中 count 个指定元素 |
LTRIM key start stop | 截取列表 |
3. List 适合哪些场景?(应用场景)
答:
- 消息队列(经典场景)
- 任务列表/异步处理
- 时间线数据(社交 feed)
- 流式数据处理
比如用 LPUSH 入队,RPOP 出队,实现简单可靠的队列模型。
4. quicklist 为什么比传统链表更好?
答:
- 链表(linkedlist)每个节点需要存两根指针(前驱、后继),空间开销大。
- quicklist 结合了:
- 压缩存储(每段是 ziplist,小数据连在一起,节省内存)
- 快速插入删除(ziplist 内局部移动快)
- 适度链表连接(避免一个超大 ziplist 导致操作慢)
✅ 快速 + 节省内存 + 适合插入删除
5. Redis List 支持阻塞操作吗?如何用?
答:
支持!用于实现阻塞式队列,常用命令有:
命令 | 说明 |
---|---|
BLPOP key [key …] timeout | 左弹出(阻塞) |
BRPOP key [key …] timeout | 右弹出(阻塞) |
- 如果列表为空,会阻塞等待元素进入,直到超时或者有元素可以弹出。
6. List 操作的时间复杂度?
答:
操作 | 复杂度 |
---|---|
LPUSH / RPUSH / LPOP / RPOP | O(1) |
LRANGE | O(N),N是返回元素个数 |
LINDEX | O(N),需要遍历到下标 |
LREM | O(N),遍历查找要移除的元素 |
⚡基本插入删除是 O(1),范围查询要小心 O(N)
7. List 有最大长度限制吗?
答:
- Redis 单个 List 最多可以存储 2³²-1 个元素,大概 40 多亿个。
- 但要注意实际受服务器内存大小限制。
8. List 是完全先入先出吗?
回答:List是双端操作对象,所以不是完全的先入先出,List也可以后入先出。
9. 怎么获得List指定范围内的数据?
回答:LRANGE命令参数为start和stop,比如一个列表有s1,s2,s3三个数据,用LRANGE 0 1就可以得到s1,s2。
10. List 如何移除特定值的数据?时间复杂度是多少?
回答:LREM命令可以移除特定值的数据,比如LREM key aaa 1,就会去移除第一个这个LIST key里面值为aaa的数据,这个操作是遍历去做的,所以时间复杂度是O(N)。
11. List 对象底层编码方式是什么?
回答:我用的是5.0.5这个版本,List对象的编码全部由QUICKLIST实现。QUICKLIST是一个压缩列表组成的双向链表,结合了ZIPLIST和LINKEDLIST两者的优点。3.2版本之前元素少单独用ZIPLIST,元素多用单独LINKEDLIST。
12. LINKEDLIST编码下,查询节点个数的时间复杂度是多少?
回答:LINKEDLIST编码下,查询节点个数的时间复杂度是O(1)。因为LINKEDLIST的表头结构中定义了链表所包含节点数量的字段len。
🚀 小总结
面试考 List,重点是:
- 知道底层(quicklist)
- 熟悉常用命令和复杂度
- 掌握应用场景(队列、阻塞)
- 了解优化点(空间、速度)