redis面试题总结

Redis 是面试中高频出现的主题,尤其是后端开发、数据架构、DevOps 等岗位。问题通常覆盖从基础使用、核心特性到高级应用、原理、运维和场景设计的方方面面。以下是一些常见的 Redis 面试题分类和示例:

一、基础概念与数据结构

  1. Redis 是什么?主要特点是什么?
    • (内存数据库、数据结构丰富、高性能、持久化、主从复制、高可用哨兵/集群、单线程模型等)
  2. Redis 支持哪些主要数据结构?分别列举它们的典型应用场景。
    • (String, Hash, List, Set, Sorted Set, Bitmap, HyperLogLog, Geospatial, Streams - 需能对应场景)
  3. String 类型除了存字符串还能存什么?INCR/DECR 命令有什么用?
    • (数字 - 整数/浮点数、二进制数据;原子计数器)
  4. List 和 Set 的主要区别是什么?Sorted Set 的核心特点是什么?
    • (List: 有序、可重复; Set: 无序、唯一; Sorted Set: 唯一、按 Score 排序)
  5. 如何用 Redis 实现一个简单的消息队列?有什么优缺点?
    • (List + LPUSH/BRPOP; 优点:简单快速; 缺点:无消息确认、无广播、无持久化保证(需配置)、无严格顺序保证(多消费者))
  6. 如何使用 Redis 实现分布式锁?需要考虑哪些关键点?
    • (核心:SET key random_value NX PX timeout; 关键点:唯一随机值、原子性、超时释放、释放锁时校验值(Lua脚本)、避免锁过期任务未完成(看门狗/续期)、集群模式下的问题(Redlock))
  7. Bitmap 和 HyperLogLog 分别解决什么问题?各自的优缺点是什么?
    • (Bitmap: 存储大量布尔值,精确操作位,节省空间; HyperLogLog: 海量数据基数统计,极省内存,近似结果)

二、持久化

  1. Redis 有哪几种持久化方式?详细说明 RDB 和 AOF 的工作原理。
    • (RDB: 快照,全量备份,fork子进程,二进制文件; AOF: 追加日志,记录写命令,文本文件)
  2. RDB 和 AOF 各自的优缺点是什么?
    • (RDB 优点:文件小、恢复快、适合备份; 缺点:可能丢失最后一次快照后的数据、fork 可能阻塞。 AOF 优点:数据安全性更高(fsync策略决定)、可读; 缺点:文件通常更大、恢复慢、写性能略低)
  3. AOF 重写 (Rewrite) 是做什么的?为什么要做?
    • (解决 AOF 文件膨胀问题; 将内存中的数据用最小命令集重建一个新的 AOF 文件)
  4. 如何配置 RDB 和 AOF 同时使用?数据恢复时加载顺序是怎样的?
    • (都开启; 优先加载 AOF 文件(通常数据更完整))
  5. 不同的 AOF fsync 策略 (no, everysec, always) 有什么区别?对性能和安全性有什么影响?

三、高可用与集群

  1. Redis 如何实现高可用?主从复制 (Replication) 的工作原理是怎样的?
    • (哨兵 Sentinel / Redis Cluster; 主从:全量同步 (RDB) + 增量同步 (命令传播))
  2. 主从复制存在延迟吗?为什么?如何尽量减少延迟?
    • (存在,网络延迟、从库负载等; 优化网络、提升从库性能、合理配置 repl-backlog 等)
  3. Redis Sentinel 是做什么的?它的核心功能是什么?
    • (监控、通知、自动故障转移(主库挂了选新主)、配置提供者)
  4. Redis Cluster 是如何实现数据分片 (Sharding) 的?
    • (哈希槽 Slot:16384个槽,分配到不同节点; CRC16(key) mod 16384 计算槽位)
  5. Redis Cluster 的节点间通信 (Gossip 协议) 是什么?
    • (P2P 通信方式,节点间交换状态信息(节点上线、下线、故障感知))
  6. 客户端如何访问 Redis Cluster?MOVED 和 ASK 重定向是什么意思?
    • (客户端需支持 Cluster 协议; MOVED:槽已永久迁移到新节点; ASK:槽正在迁移中,临时重定向)
  7. Redis Cluster 为什么至少需要 3 个主节点?为什么推荐 6 个节点(3主3从)?
    • (故障选举需要大多数节点存活(N/2+1),3主节点挂1个还能选举; 6节点(3主3从)提供高可用和负载均衡)
  8. Redis Cluster 支持跨槽位的事务 (Multi-key operations) 吗?为什么?
    • (不支持。事务或Lua脚本中的key必须都在同一个节点(同一个槽位),否则报错。可以用 hash tags 强制 key 分配到同一槽位)

四、性能与原理

  1. Redis 为什么这么快?
    • (纯内存操作、单线程避免上下文切换和锁竞争、高效的数据结构(如哈希表、跳表)、IO多路复用(epoll/kqueue)、优化的网络模型)
  2. Redis 是单线程的吗?为什么设计成单线程?单线程有什么优势和劣势?
    • (命令处理核心是单线程; 避免锁、上下文切换开销,简化实现; 优势:简单高效; 劣势:无法利用多核CPU、长命令/大Key会阻塞其他命令)
  3. 什么是 IO 多路复用?Redis 如何利用它?
    • (一种同步IO模型,一个线程监控多个文件描述符状态(可读/可写); Redis 使用 epoll/kqueue/select 监听大量客户端连接)
  4. 什么是 Pipeline?它为什么能提升性能?使用时需要注意什么?
    • (客户端将多个命令打包一次性发送,服务端一次性返回结果; 减少 RTT(往返时间)和 socket I/O 次数; 注意:打包的命令数量不宜过大,避免阻塞)
  5. 什么是 Big Key(大Key)?它有什么危害?如何发现和处理?
    • (Value 过大的 Key(如大 String、元素超多的 Hash/List/Set/ZSet); 危害:阻塞操作、内存不均、网络拥塞、迁移困难; 发现:redis-cli --bigkeysMEMORY USAGESCAN + 类型命令; 处理:拆分、压缩、删除、优化数据结构)
  6. 什么是 Hot Key(热Key)?它有什么危害?如何应对?
    • (访问频率极高的 Key; 危害:造成单节点/单分片压力过大、可能成为瓶颈; 应对:本地缓存(客户端/代理层)、读写分离、利用 Redis Cluster 分片打散(加随机后缀)、二级缓存)
  7. Redis 的内存淘汰策略有哪些?
    • (noeviction (默认, 报错), allkeys-lru, volatile-lru, allkeys-lfu, volatile-lfu, allkeys-random, volatile-random, volatile-ttl)
  8. LRU 和 LFU 淘汰策略的区别是什么?
    • (LRU: 最近最少使用,看最后一次访问时间; LFU: 最不经常使用,统计访问频率)

五、应用场景与设计

  1. 设计一个用户点赞/取消点赞的功能,如何保证原子性和防止重复点赞?
    • (使用 Set, SADD user:likes:post_id user_id / SREM, SISMEMBER 检查是否已点)
  2. 如何实现一个排行榜?
    • (Sorted Set, ZADD 分数, ZREVRANGE 取 Top N)
  3. 如何实现一个分布式 Session?
    • (将 Session 数据存储在 Redis 中,Key 通常为 SessionID)
  4. 如何防止缓存穿透、缓存雪崩、缓存击穿?
    • 穿透: 大量请求不存在的数据(查 DB) -> 布隆过滤器、缓存空对象(短过期)。
    • 雪崩: 大量缓存同时失效 -> 设置随机过期时间、永不过期 + 后台更新、高可用架构。
    • 击穿: 热点 Key 失效瞬间大量请求 -> 互斥锁(Redis SETNX)、永不过期 + 逻辑过期。
  5. 如何保证缓存与数据库的双写一致性?
    • (复杂问题!常见方案:Cache Aside Pattern(旁路缓存 - 先更DB再删缓存)、延时双删、基于 binlog 的异步更新(如 Canal) - 需权衡一致性要求与复杂度)
  6. 如何用 Redis 实现一个简单的秒杀系统?需要考虑哪些问题?
    • (预减库存(DECR)、原子性、防超卖、限流、热点数据(库存 Key)、异步下单、结果轮询/通知)

六、运维与监控

  1. 如何监控 Redis 的性能和状态?
    • (INFO 命令(memory, stats, replication, cpu 等)、redis-cli monitor (谨慎)、SLOWLOGCLIENT LIST、Prometheus + Grafana + Redis Exporter)
  2. Redis 的 maxmemory 配置有什么作用?如何选择淘汰策略?
  3. 如何安全地重启 Redis?
    • (主从切换、配置 SHUTDOWN SAVE/SHUTDOWN NOSAVE、使用 CONFIG REWRITE 避免配置丢失)
  4. Redis 的常见性能瓶颈有哪些?如何排查?
    • (CPU:复杂命令/大Key、阻塞; 内存:不足/OOM; 网络:带宽/延迟; 磁盘:AOF fsync; 排查:SLOWLOG, INFO, top, iostat, netstat 等)

准备建议

  1. 理解原理: 不要死记硬背,理解为什么这样设计(如单线程、持久化机制、集群分片)。
  2. 熟悉数据结构与场景: 这是基础,务必清晰每种结构的特性和最佳适用场景。
  3. 掌握核心机制: 持久化(RDB/AOF)、复制(主从)、高可用(Sentinel/Cluster)是重中之重。
  4. 了解常见问题与解决方案: Big Key, Hot Key, 缓存异常(穿透/雪崩/击穿)、一致性问题是高频考点。
  5. 动手实践: 搭建 Redis 环境,亲自操作命令,配置主从、哨兵或集群,模拟故障转移。
  6. 关注版本差异: Redis 6 (多线程IO)、7 引入了一些新特性(如 Functions)。
  7. 结合项目经验: 如果能结合你实际项目中使用 Redis 的经验(解决了什么问题,遇到了什么坑,怎么解决的),会非常加分。
相关推荐
超浪的晨2 小时前
Java 实现 B/S 架构详解:从基础到实战,彻底掌握浏览器/服务器编程
java·开发语言·后端·学习·个人开发
追逐时光者3 小时前
一款超级经典复古的 Windows 9x 主题风格 Avalonia UI 控件库,满满的回忆杀!
后端·.net
Python涛哥4 小时前
go语言基础教程:【1】基础语法:变量
开发语言·后端·golang
我命由我123454 小时前
PostgreSQL 保留关键字冲突问题:语法错误 在 “user“ 或附近的 LINE 1: CREATE TABLE user
数据库·后端·sql·mysql·postgresql·问题·数据库系统
LUCIAZZZ5 小时前
final修饰符不可变的底层
java·开发语言·spring boot·后端·spring·操作系统
wsj__WSJ5 小时前
Spring Boot 请求参数绑定:全面解析常用注解及最佳实践
java·spring boot·后端
CodeUp.6 小时前
SpringBoot航空订票系统的设计与实现
java·spring boot·后端
码事漫谈6 小时前
Linux下使用VSCode配置GCC环境与调试指南
后端
求知摆渡6 小时前
RocketMQ 从二进制到 Docker 完整部署(含 Dashboard)
运维·后端