当前位置: 首页 > 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)
  • 熟悉常用命令和复杂度
  • 掌握应用场景(队列、阻塞)
  • 了解优化点(空间、速度)

http://www.xdnf.cn/news/156655.html

相关文章:

  • 26 Arcgis软件常用工具有哪些
  • JUC多线程:辅助类CountDownLatch、CyclicBarrier、Semaphore实战指南(附保姆级代码)
  • AIGC在自动化测试领域的创新应用:智能生成测试用例与缺陷预测
  • 云原生--核心组件-容器篇-2-认识下Docker(三大核心之镜像,容器,仓库)
  • 前端与Rust后端交互:跨越语言鸿沟 (入门系列三)
  • JS自动化获取网站信息开发说明
  • Dify框架面试内容整理-Dify如何实现模型调用与管理?
  • 使用Django框架表单
  • 软件设计案例分析学习笔记
  • 如何创建一个导入模板?全流程图文解析
  • LeetCode --- 446 周赛
  • Simple-BEV论文解析
  • 关于聚簇索引
  • 【软考-架构】13.5、中间件
  • Linux——动静态库
  • WPF 实现PLC数据采集
  • 如何打包python程序为可执行文件
  • linux中shell脚本的编程使用
  • 一台服务器已经有个python3.11版本了,如何手动安装 Python 3.10,两个版本共存
  • deepseek-cli开源的强大命令行界面,用于与 DeepSeek 的 AI 模型进行交互
  • Pygame音效与音乐:为你的游戏注入灵魂
  • LLaMa Factory大模型微调
  • shell语言核心语法
  • RabbitMQ全栈实践手册:从零搭建消息中间件到SpringAMQP高阶玩法
  • 数据结构和算法(九)--红黑树
  • C++?类和对象(下)!!!
  • 精益数据分析(27/126):剖析用户价值与商业模式拼图
  • 观察者模式 (Observer Pattern)
  • 游戏引擎学习第246天:将 Worker 上下文移到主线程创建
  • 如何给GitHub项目提PR(踩坑记录