当前位置: 首页 > news >正文

Redis常见面试题——List对象

当然可以!这里我帮你整理了一份【Redis中 List 结构】相关的高频面试题,并附上简明回答:


📚 Redis List 结构面试题(高频总结版)


1. Redis 中的 List 是什么?底层是什么实现的?

答:

  • Redis 的 List 是双向链表(早期直接是 quicklist 之前是 ziplistlinkedlist)。
  • 具体底层:
    • 小数据量时(元素少、元素小):使用 压缩列表(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 / RPOPO(1)
LRANGEO(N),N是返回元素个数
LINDEXO(N),需要遍历到下标
LREMO(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)
  • 熟悉常用命令和复杂度
  • 掌握应用场景(队列、阻塞)
  • 了解优化点(空间、速度)

相关文章:

  • Redis 数据分片三大方案深度解析与 Java 实战
  • Python爬虫实战:获取高考资源网各学科精品复习资料
  • 蓝桥杯 8. 移动距离
  • Angular开发经常涉及到组件间传递参数,用原生js开发时,如何解决这些问题?
  • 使用 Spring Boot 进行开发
  • 印刷设备管理绩效考核制度与设备优化路径
  • Linux: 如何在VMware上安装Ubuntu操作系统
  • 72.评论日记
  • WPF定义扩展属性和依赖属性
  • Prometheus、Zabbix 和 Nagios 这三个工具的对100个节点的部署设计的信息流
  • WPF 实现PLC数据采集
  • A. Ambitious Kid
  • 网络原理由浅到深
  • 打破云墙:多云环境中的DevOps实践指南
  • qt之开发大恒usb3.0相机一
  • MySQL初阶 | 表的增删查改
  • 关于聚簇索引
  • 利用Arcgis自己绘制shp文件
  • 基于MTF的1D-2D-CNN-BiLSTM-Attention时序图像多模态融合的故障分类识别(Matlab完整源码和数据),适合研究学习,附模型研究报告
  • 若干查找算法
  • 一个失败的赛季咎由自取,皇马只能把希望留到夏天
  • 谁将主导“视觉大脑”?中国AI的下一个超级赛道
  • 新闻1+1丨应对外部冲击,中央政治局会议释放哪些信号?
  • 白俄罗斯驻华大使:应发挥政党作用,以对话平台促上合组织发展与合作
  • 李良生已任应急管理部党委委员、政治部主任
  • 68岁民营科技企业家、中国环保产业协会原副会长宋七棣逝世