Redis 面试题精编(70道|含答案|分类整理)
1. 什么是 Redis?
Redis 是一个使用 C 语言编写的开源高性能 key-value 内存数据库,支持 String、List、Set、ZSet、Hash 等多种数据结构,读写性能极高(10万+ QPS),支持持久化、主从复制、事务和原子操作。
2. Redis 有哪些优缺点?
优点:
- 读写性能优异(读 ≈11w/s,写 ≈8w/s);
- 支持 RDB 和 AOF 持久化;
- 数据结构丰富;
- 支持事务(命令原子性);
- 支持主从复制与高可用。
缺点:
- 内存受限,不适合海量数据;
- 主从模式无自动容错(需哨兵/Cluster);
- 主机宕机可能导致数据丢失;
- 在线扩容困难(非 Cluster 模式)。
3. 使用 Redis 有哪些好处?
- 速度快(内存操作);
- 支持丰富数据类型;
- 支持原子性事务;
- 可设置过期时间,自动清理;
- 适用于缓存、消息队列、分布式锁等场景。
4. 为什么要用 Redis / 为什么要用缓存?
- 高性能:缓存命中直接返回,避免慢速磁盘 IO;
- 高并发:缓存层可承接大量请求,保护数据库。
5. 为什么要用 Redis 而不用 map/guava 做缓存?
- Map/Guava 是本地缓存,多实例间数据不一致;
- Redis 是分布式缓存,多服务共享同一份数据,保证一致性。
6. Redis 为什么这么快?
- 完全基于内存操作;
- 数据结构简单高效;
- 单线程避免锁竞争和上下文切换;
- 使用 I/O 多路复用(epoll/kqueue);
- 自研协议减少系统调用开销。
7. Redis 有哪些数据类型?
- String:字符串、整数、浮点数;
- List:双向链表;
- Set:无序唯一集合;
- Hash:键值对结构;
- ZSet(Sorted Set):有序唯一集合(带 score)。
8. Redis 的应用场景?
- 缓存(热点数据);
- 计数器(INCR);
- 会话共享;
- 全页缓存(FPC);
- 查找表(如 DNS);
- 消息队列(List/PubSub);
- 分布式锁;
- 排行榜(ZSet);
- 共同好友(Set 交集)。
9. 什么是 Redis 持久化?
将内存中的数据写入磁盘,防止服务宕机导致数据丢失。
10. Redis 的持久化机制是什么?各自的优缺点?
- RDB(快照):
- 优点:文件小、恢复快、性能高;
- 缺点:可能丢失最后一次快照后的数据。
- AOF(日志):
- 优点:数据更安全(可配置同步频率);
- 缺点:文件大、恢复慢。
同时开启时,优先使用 AOF 恢复。
11. 如何选择合适的持久化方式?
- 高安全:RDB + AOF;
- 可容忍分钟级丢失:仅 RDB;
- 极致性能:仅 AOF 或无持久化;
- 备份需求:必须保留 RDB。
12. Redis 持久化数据和缓存怎么做扩容?
- 作为缓存:使用一致性哈希动态扩缩容;
- 作为存储:必须使用 Redis Cluster(支持运行时再平衡)。
13. Redis 的过期键的删除策略?
- 惰性删除:访问时检查并删除;
- 定期删除:定时随机扫描部分 key 删除;
Redis 同时使用两种策略。
14. Redis key 的过期时间和永久有效分别怎么设置?
EXPIRE key seconds:设置过期时间;PERSIST key:取消过期,变为永久有效。
15. 对过期的数据怎么处理?
- 方案一:定时任务清理(维护成本高);
- 方案二:访问时判断是否过期,过期则回源更新(逻辑复杂);
实际中 Redis 自动通过惰性+定期策略处理。
16. MySQL 里有 2000w 数据,Redis 中只存 20w,如何保证都是热点数据?
通过配置 内存淘汰策略(如 allkeys-lru),当内存满时自动淘汰冷数据,保留热点数据。
17. Redis 的内存淘汰策略有哪些?
- 全局淘汰:
noeviction:不淘汰,写入报错;allkeys-lru:淘汰最近最少使用的 key(最常用);allkeys-random:随机淘汰。
- 仅淘汰带过期时间的 key:
volatile-lruvolatile-randomvolatile-ttl(优先淘汰快过期的)
18. Redis 主要消耗什么物理资源?
内存。
19. Redis 的内存用完了会发生什么?
- 若未配置淘汰策略:写命令失败,读命令正常;
- 若配置了淘汰策略:自动驱逐旧数据,继续服务。
20. Redis 如何做内存优化?
- 使用 Hash 合并小 key(如用户信息存一个 hash);
- 避免大 value;
- 设置合理过期时间。
21. Redis 线程模型?
基于 Reactor 模式,使用 I/O 多路复用监听多个 socket,文件事件处理器单线程执行命令,保证简单高效。
22. 什么是事务?
事务是一组命令的集合,具有 隔离性(不被其他请求打断)和 原子性(要么全执行,要么全不执行)。
23. Redis 事务的概念?
通过 MULTI 开启事务,命令入队,EXEC 执行。期间命令不会立即执行,而是排队串行执行。
24. Redis 事务的三个阶段?
- 事务开始(
MULTI); - 命令入队;
- 事务执行(
EXEC)。
25. Redis 事务相关命令?
MULTI:开启事务;EXEC:执行事务;DISCARD:取消事务;WATCH:监控 key,实现乐观锁;UNWATCH:取消监控。
⚠️ Redis 事务 不支持回滚。
26. 事务管理(ACID)概述?
- 原子性:Redis 不完全支持(失败不回滚);
- 一致性:支持;
- 隔离性:支持(单线程);
- 持久性:仅在 AOF +
appendfsync always下支持。
27. Redis 事务支持隔离性吗?
支持。因单线程执行,事务过程中不会被其他命令插入。
28. Redis 事务保证原子性吗,支持回滚吗?
不保证原子性,不支持回滚。某条命令失败,其余命令仍会执行。
29. Redis 事务其他实现?
- Lua 脚本:保证脚本内命令原子执行;
- 中间标记变量:手动控制事务状态(繁琐,不推荐)。
30. 哨兵模式?
哨兵(Sentinel)是 Redis 高可用组件,功能包括:
- 监控 master/slave 状态;
- 故障时自动 failover;
- 通知客户端新 master 地址;
- 至少部署 3 个哨兵 避免脑裂。
31. 官方 Redis Cluster 方案?
- 采用 16384 个哈希槽 分片;
- key 通过
CRC16(key) % 16384定位槽; - 支持自动分片、故障转移;
- 节点间通过 Gossip 协议(16379 端口)通信;
- 客户端直连,通过
-MOVED重定向。
32. 基于客户端分配?
- 客户端通过 hash 算法决定 key 存到哪个 Redis 实例;
- 优点:简单、易扩展;
- 缺点:不支持动态扩缩容,运维复杂。
33. 基于代理服务器分片?
- 客户端 → 代理(如 Twemproxy、Codis)→ Redis;
- 优点:对业务透明;
- 缺点:多一次网络转发,性能损耗。
34. Redis 主从架构?
- 一主多从,主写从读;
- 异步复制,不阻塞主节点;
- 用于读写分离、水平扩容;
- 建议开启 master 持久化,防止数据丢失。
35. Redis 集群的主从复制模型是怎样的?
每个主节点可配置多个从节点,用于故障转移和读负载分担。集群通过主从复制保证高可用。
36. 生产环境中的 Redis 是怎么部署的?
典型方案:Redis Cluster,例如 10 台机器(5 主 5 从),每主挂一从,总内存 50GB,QPS 可达 25w+。机器配置通常为 32G 内存,Redis 进程分配 ≤10G。
37. 说说 Redis 哈希槽的概念?
Redis Cluster 将 key 空间划分为 16384 个哈希槽,每个 key 通过 CRC16(key) % 16384 映射到某个槽,每个节点负责一部分槽。
38. Redis 集群会有写操作丢失吗?为什么?
会丢失。因采用 异步复制,若主节点宕机且未同步到从节点,则这部分写操作丢失。Redis 不保证强一致性。
39. Redis 集群之间是如何复制的?
异步复制。
40. Redis 集群最大节点个数是多少?
理论上最多 16384 个节点(每个节点至少负责 1 个槽),但实际受网络和运维限制,通常几十个。
❗注意:16384 是 槽的数量,不是强制节点数。
41. Redis 集群如何选择数据库?
不支持。Redis Cluster 只能使用 0 号数据库。
42. Redis 是单线程的,如何提高多核 CPU 的利用率?
在同一台服务器部署 多个 Redis 实例,当作多个独立服务使用,实现 CPU 多核利用。
43. 为什么要做 Redis 分区?
- 突破单机内存限制;
- 提升整体计算与网络吞吐能力;
- 实现水平扩展。
44. 有哪些 Redis 分区实现方案?
- 客户端分区(如 ShardedJedis);
- 代理分区(如 Twemproxy、Codis);
- 查询路由(Redis Cluster)。
45. Redis 分区有什么缺点?
- 不支持跨 key 操作(如交集、事务);
- 数据备份复杂(需从多个实例收集);
- 动态扩缩容困难(除 Cluster 外)。
46. Redis 实现分布式锁?
使用 SET key value NX EX timeout 命令:
NX:仅当 key 不存在时设置;EX:设置过期时间防死锁;- 释放锁需用 Lua 脚本校验 value 后删除。
47. 如何解决 Redis 的并发竞争 Key 问题?
使用 分布式锁(Redis 或 ZooKeeper 实现)。推荐 ZooKeeper(更可靠),但 Redis 性能更高。
48. 分布式 Redis 是前期做还是后期规模上来了再做好?为什么?
建议前期就做。即使单机,也可启动多个实例模拟分片。未来扩容只需迁移实例,无需重新分片。
49. 什么是 RedLock?
Redis 官方提出的分布式锁算法,通过 多数 Redis 节点投票 获取锁,具备:
- 互斥性;
- 防死锁;
- 容错性(多数节点存活即可)。
50. 什么是 Redis 穿透?【缓存穿透】
用户查询 不存在的数据,请求绕过缓存直达数据库,造成 DB 压力。
解决方案:
- 缓存空值(短 TTL);
- 布隆过滤器拦截;
- 接口层校验 ID 合法性。
51. 什么是 Redis 雪崩?
大量 key 同时过期 或 Redis 宕机,导致瞬间大量请求打到数据库,引发雪崩。
解决方案:
- 过期时间加随机值;
- Redis 集群部署;
- 服务降级 + 熔断。
52. 什么是 Redis 击穿?(原文误标为“穿透”)【缓存击穿】
热点 key 过期瞬间,大量并发请求同时查 DB 并重建缓存,导致 DB 压力骤增。
解决方案:
- 互斥锁(只允许一个线程查 DB);
- 热点数据永不过期 + 后台更新。
53. 缓存预热?
系统上线前,将热点数据预先加载到 Redis,避免用户首次访问时查 DB。
方案:
- 启动时自动加载;
- 手动刷新页面;
- 定时任务预热。
54. 缓存降级?
当 Redis 故障或系统压力过大时,暂时放弃缓存,直接返回默认值或限流访问 DB,保证核心服务可用。
55. 热点数据和冷数据?
- 热点数据:频繁访问,缓存价值高;
- 冷数据:很少访问,缓存易被淘汰,占用内存无意义。
缓存有意义的前提:数据至少被读取两次。
56. 缓存热点 key?
某个 key(如促销商品)在过期瞬间遭遇高并发请求,导致 DB 压力激增。
解决方案:
- 加互斥锁重建缓存;
- 设置逻辑过期(后台异步更新)。
57. Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?
- Jedis、Lettuce、Redisson;
- 官方推荐 Redisson(提供分布式对象封装)。
58. Redis 和 Redisson 有什么关系?
Redisson 是基于 Redis 的 Java 客户端,提供 Lock、Queue、Map 等分布式对象,简化开发。
59. Jedis 与 Redisson 对比有什么优缺点?
- Jedis:轻量,API 全面,支持所有 Redis 命令;
- Redisson:高级抽象,支持分布式锁/队列等,但不支持部分底层命令(如 pipeline、事务)。
60. Redis 与 Memcached 的区别?
| 项目 | Redis | Memcached |
|---|---|---|
| 数据类型 | 5 种 | 仅 String |
| 持久化 | 支持 | 不支持 |
| 集群 | 原生支持 | 客户端分片 |
| 线程模型 | 单线程(6.0+ 多线程 IO) | 多线程 |
| 性能 | 复杂操作更快 | 简单 get/set 极快 |
61. 如何保证缓存与数据库双写时的数据一致性?
推荐 Cache-Aside Pattern:
- 更新数据库;
- 删除缓存;
允许短暂不一致,但避免脏读。极端场景可串行化(性能差)。
62. Redis 常见性能问题和解决方案?
- Master 不做持久化(由 Slave 做 AOF);
- 主从同局域网;
- 避免在主库压力大时加从库;
- 主从用链式结构(M ← S1 ← S2);
- 避免大 key、频繁 BGREWRITEAOF。
63. Redis 官方为什么不提供 Windows 版本?
Linux 版本已非常稳定,用户量大,Windows 版本会带来兼容性和维护成本。
64. 一个字符串类型的值能存储最大容量是多少?
512 MB。
65. Redis 如何做大量数据插入?
使用 redis-cli --pipe 模式(管道批量导入),避免多次网络往返。
66. 假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定前缀开头的,如何将它们全部找出来?
- ❌ 禁用
KEYS prefix*(阻塞主线程); - ✅ 使用
SCAN命令无阻塞遍历,客户端去重。
67. 使用 Redis 做过异步队列吗,是如何实现的?
- List:
RPUSH生产,LPOP/BLPOP消费; - Pub/Sub:支持多消费者,但消息可能丢失(无持久化)。
68. Redis 如何实现延时队列?
使用 ZSet:
ZADD queue timestamp job;- 消费者轮询
ZRANGEBYSCORE queue 0 now; - 处理完后
ZREM。
69. Redis 回收进程如何工作的?
- 客户端写入新数据;
- Redis 检查内存是否超限(
maxmemory); - 若超限,按淘汰策略回收;
- 继续执行命令。
70. Redis 回收使用的是什么算法?
- 近似 LRU(非严格 LRU,节省内存);
- Redis 4.0+ 支持 LFU(Least Frequently Used)。
