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

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-lru
    • volatile-random
    • volatile-ttl(优先淘汰快过期的)

18. Redis 主要消耗什么物理资源?

内存


19. Redis 的内存用完了会发生什么?

  • 若未配置淘汰策略:写命令失败,读命令正常;
  • 若配置了淘汰策略:自动驱逐旧数据,继续服务。

20. Redis 如何做内存优化?

  • 使用 Hash 合并小 key(如用户信息存一个 hash);
  • 避免大 value;
  • 设置合理过期时间。

21. Redis 线程模型?

基于 Reactor 模式,使用 I/O 多路复用监听多个 socket,文件事件处理器单线程执行命令,保证简单高效。


22. 什么是事务?

事务是一组命令的集合,具有 隔离性(不被其他请求打断)和 原子性(要么全执行,要么全不执行)。


23. Redis 事务的概念?

通过 MULTI 开启事务,命令入队,EXEC 执行。期间命令不会立即执行,而是排队串行执行。


24. Redis 事务的三个阶段?

  1. 事务开始(MULTI);
  2. 命令入队;
  3. 事务执行(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 的区别?

项目RedisMemcached
数据类型5 种仅 String
持久化支持不支持
集群原生支持客户端分片
线程模型单线程(6.0+ 多线程 IO)多线程
性能复杂操作更快简单 get/set 极快

61. 如何保证缓存与数据库双写时的数据一致性?

推荐 Cache-Aside Pattern

  1. 更新数据库;
  2. 删除缓存;

允许短暂不一致,但避免脏读。极端场景可串行化(性能差)。


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 做过异步队列吗,是如何实现的?

  • ListRPUSH 生产,LPOP/BLPOP 消费;
  • Pub/Sub:支持多消费者,但消息可能丢失(无持久化)。

68. Redis 如何实现延时队列?

使用 ZSet

  • ZADD queue timestamp job
  • 消费者轮询 ZRANGEBYSCORE queue 0 now
  • 处理完后 ZREM

69. Redis 回收进程如何工作的?

  1. 客户端写入新数据;
  2. Redis 检查内存是否超限(maxmemory);
  3. 若超限,按淘汰策略回收;
  4. 继续执行命令。

70. Redis 回收使用的是什么算法?

  • 近似 LRU(非严格 LRU,节省内存);
  • Redis 4.0+ 支持 LFU(Least Frequently Used)。
http://www.dtcms.com/a/611075.html

相关文章:

  • 苏州做公司网站设计的公司网站建设项目执行进度表
  • 发布网站域名设置wordpress 搭建 查分系统
  • 四旋翼无人机视觉目标跟踪系统完整实现指南
  • 网站建设与管理案例柳洪轶苏州保洁公司招聘保洁区域经理
  • 中国核工业华兴建设有限公司网站c蔡甸区城乡建设局网站
  • 如何使用C语言反编译程序 | 反编译技术和注意事项
  • 免费设计签名在线生成网络推广seo怎么弄
  • 威海住房和城乡建设厅网站新国标小区网络建设
  • 河北建设厅官方网站聊城网站建设工作室
  • AURIX与tasking改变字体大小
  • MySQL 条件唯一索引实战:用 delete_time 实现活跃记录唯一
  • ⭐ TIE Cell(Tie-High / Tie-Low)完整技术总结与工程指导
  • 淘宝网站c 设计怎么做wordpress屏蔽右键
  • 苏州网站制作公司合肥建设网
  • 简化接口测试:利用Dify工作流结合CI/CD,实现一键式回归验证
  • 网站建设宣传方案三更app下载网站
  • 济宁祥云网站建设深圳龙华是低风险区吗
  • 如何利用个人nas做网站广州市建设局官方网站
  • Linux内核LED驱动开发:实现可控制闪烁与常亮的GPIO驱动
  • 信息论(四):熵与概率分布的期望
  • 辽宁网站网站建设刚刚中国突然宣布
  • Mysql主从复制 windows下
  • 白云区网站建设公成都建设高端网站
  • UART、IIC、SPI、CAN通信协议简介
  • 鸿蒙系统编译语言 | 深入探讨鸿蒙编译技术及其应用前景
  • 网站建设一对一培训网站建设ssc源码最新
  • C语言编译速度 | 提升编译效率的方法与技巧
  • 【Python爬虫基础-3】数据解析
  • 做网站能用思源黑体吗wordpress文章页面模板
  • 精品源码分享的网站首尔面积