整理自 Redis 面试题 15 道,已精简冗余表述。详细原理见 Redis 基础。
相关学习笔记
| 专题 | 笔记 |
|---|---|
| Redis 基础 | Redis 基础 |
| MySQL 基础 | MySQL 基础 |
目录
基础与使用
1. Redis 是什么
基于内存的 NoSQL KV 数据库;单线程处理命令(高版本 IO 可多线程),高并发读写;key 为字节数组。Java 常用 Jedis / Lettuce 访问。value 支持 String、List、Set、ZSet、Hash。→ Redis 基础
2. Redis 怎么使用
安装并启动 Redis;项目中引入依赖(如 spring-boot-starter-data-redis);配置连接(application.yml 或 redis.properties);在 Service/Mapper 层通过模板或客户端读写缓存。
3. 应用场景有哪些
| 结构 | 场景 |
|---|---|
| String | JSON 对象缓存、计数器、点赞数 |
| List | 队列/栈、朋友圈点赞列表 |
| Hash | 存对象字段、分组 |
| Set | 去重、共同关注 |
| ZSet | 排行榜 |
示例:内容 user:x:post:x,点赞 post:x:good 用 List 存头像或用户 id。
4. 为什么 Redis 单线程还那么快
- 数据在内存
- IO 多路复用(epoll)
- 单线程无锁,无上下文切换竞争
5. Redis 可以进行发布订阅吗
可以 Pub/Sub。哨兵节点每 2s 向频道发布对主节点的判断,其他哨兵订阅实现互相监控。相比 Kafka/RocketMQ 较简单,无堆积与回溯;适合通知,不适合可靠消息队列。
持久化与高可用
6. Redis 能否持久化?如何实现
可以,两种方式:
| 方式 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| RDB | bgsave fork 写快照,定时全量 | 紧凑、恢复快 | 非实时,fork 开销 |
| AOF | 每条写命令追加日志 | 更实时 | 文件大,需 rewrite,恢复慢 |
7. 主从复制模式下,主挂了怎么办
使用 哨兵模式(Sentinel):哨兵监控主从及其他哨兵,主节点故障时自动故障转移,选举新主。
8. 哨兵模式实现原理(2.8+)
- 三个定时任务:10s
INFO;2s 频道广播主观判断;1sPING心跳 - 主观下线:单哨兵认为节点不可达
- 客观下线:主节点主观下线且半数以上哨兵同意
- 选举领导者:类似 Raft,获半数票者执行转移
- 故障转移:从从库选新主
9. Redis 集群原理(3.0+,虚拟槽)
16384 槽分片;节点 ping/pong 传播槽与状态;pfail(主观)→ fail(客观,过半)→ 选举领导者 → 提升从节点为新主。与哨兵类似,面向分片 + 高可用。
缓存策略与问题
10. 缓存更新策略(与 MySQL 一致性)
- 过期剔除:TTL、惰性 + 定期删除
- 更新策略:Cache Aside(先更 DB 再删缓存)、延迟双删、订阅 binlog 异步更新等
- 内存淘汰:
allkeys-lru、volatile-lru等(内存满时)
过期为何内存仍高:惰性删除未访问的 key 仍在;定期删除只抽样部分 key。
10.1 Key 过期清除策略
- 惰性过期:访问时才判断是否过期
- 定期过期:周期扫描
expires字典部分 key
两者结合,平衡 CPU 与内存。
10.2 Redis 内存淘汰策略
noeviction(默认,写入报错)、allkeys-lru、allkeys-random、volatile-lru、volatile-random、volatile-ttl。
11. 缓存粒度控制
- 粗:整页/整对象一个 key,命中高,更新成本高
- 细:按字段或实体拆分,灵活,key 多、管理复杂
按更新频率和读模式权衡。
12. 如何防止缓存穿透
查询不存在的数据,缓存与 DB 都不命中,大量请求压垮 DB。
- 缓存空值:简单,需短 TTL,防占满内存
- 布隆过滤器:预判 key 是否存在,实现较复杂
13. 无底洞优化
集群节点过多,批量操作跨节点网络次数增加,延迟上升。优化:控制 key 分布、hash tag 相关 key 同槽、减少过大集群分片、合并批量请求。
14. 雪崩优化
缓存大面积失效或 Redis 宕机,请求打到 DB 导致级联故障。
- 过期时间加随机
- 集群高可用 + 限流降级
- 多级缓存、热点永不过期(逻辑过期)
15. 热点 key 优化
单个 key QPS 极高(热搜、爆款)。
- 本地缓存(Caffeine)
- 多副本 key 分散读
- 互斥重建、逻辑过期防击穿