Redis 核心面试题含答案

Redis 核心面试题含答案 Redis 核心面试题含答案适合 Java 后端Spring Boot 项目实习面试项目答辩复习背诵建议面试前优先背Redis 为什么快、五大数据结构、缓存穿透/雪崩/击穿、缓存一致性、分布式锁、Redisson、秒杀防超卖、持久化、主从哨兵集群。目录一、Redis 基础认知题二、数据结构与 Key 设计题三、Spring Boot 整合与登录态题四、缓存实战与一致性题五、缓存穿透、雪崩、击穿题六、秒杀、Lua 与分布式锁题七、消息队列、统计与业务场景题八、主从、哨兵、集群与底层原理题九、项目面试表达模板十、面试前快速背诵版一、Redis 基础认知题1. Redis 是什么它主要用来解决什么问题参考答案Redis 是一种基于内存的键值型 NoSQL 数据库常用于缓存、验证码、排行榜、分布式锁、消息队列、会话共享等高并发场景。它不是 MySQL 的替代品而是 MySQL 的性能补充。项目表达在商城项目里我会把商品详情、登录验证码、token、热点排行榜等放入 Redis以减少数据库压力。2. Redis 和 MySQL 有什么区别参考答案MySQL 是关系型数据库数据主要落磁盘适合保存用户、订单、商品等强一致业务数据Redis 是内存型 NoSQL读写速度快适合保存可过期、可重建、访问频繁的数据。核心业务数据仍然以 MySQL 为准Redis 主要做缓存和辅助能力。3. Redis 为什么速度快参考答案主要原因有数据存储在内存中命令执行模型简单单线程执行命令减少锁竞争和上下文切换使用 I/O 多路复用提升网络处理能力底层数据结构设计高效。4. Redis 可以完全替代 MySQL 吗参考答案不能。Redis 更适合缓存和高性能读写场景但内存容量有限数据一致性和持久化能力不如 MySQL。订单、支付、用户等核心数据必须落 MySQLRedis 只保存缓存、临时状态或可重建数据。5. Redis 默认端口是多少如何测试 Redis 是否可用参考答案Redis 默认端口是 6379。可以使用 redis-cli 连接后执行 PING如果返回 PONG说明 Redis 服务正常。6. 生产环境使用 Redis 要注意什么参考答案生产环境需要设置密码、限制外网访问、配置防火墙、开启持久化、合理设置 maxmemory 和淘汰策略禁止随意执行 FLUSHALL、KEYS * 等高风险命令。二、数据结构与 Key 设计题7. Redis 常见的五大基本数据结构有哪些参考答案常见五大基本数据结构包括 String、Hash、List、Set、Sorted Set/ZSet。String 常用于验证码和缓存对象Hash 常用于对象字段List 可做简单队列Set 可做点赞收藏ZSet 可做排行榜。8. String 类型适合什么场景参考答案String 是最常用的数据结构可以保存字符串、数字、JSON。常见场景有验证码、token、计数器、商品详情 JSON 缓存、阅读量统计等。9. Hash 类型适合什么场景参考答案Hash 适合保存对象结构例如用户信息、商品信息、购物车。它可以针对对象中的某个字段单独读写不必每次替换整个 JSON。10. String 和 Hash 怎么选择参考答案简单字符串、数字、JSON 对象缓存可以用 String如果对象字段经常单独修改例如购物车中某个商品数量变化可以用 Hash。11. List 类型适合什么场景参考答案List 是有序列表可从两端插入和弹出适合做简单队列、消息列表、最新动态列表。但可靠消息队列场景更推荐 Stream 或专业 MQ。12. Set 类型适合什么场景参考答案Set 是无序去重集合适合点赞、收藏、关注、标签、共同好友等场景。比如 like:article:1 里存放点赞用户 id可以用 SISMEMBER 判断用户是否点赞。13. ZSet 类型适合什么场景参考答案ZSet 是带分数的有序集合适合排行榜、热度榜、积分榜、延迟队列等场景。比如校园热榜可以用热度值作为 score。14. Redis Key 应该如何命名参考答案推荐使用“业务:对象:标识”的格式例如 login:code:{phone}、login:token:{token}、cache:product:{id}、lock:order:{userId}。这样可读性强也方便排查和统一管理。15. 为什么生产环境不建议使用 KEYS *参考答案KEYS * 会一次性扫描所有 key数据量大时可能阻塞 Redis影响线上请求。生产环境推荐使用 SCAN 分批扫描。16. TTL 的作用是什么参考答案TTL 用于查看 key 剩余过期时间。缓存类 key 应该设置过期时间避免长期占用内存也能降低缓存脏数据长期存在的风险。三、Spring Boot 整合与登录态题17. Spring Boot 项目中常用哪个 Redis 操作类参考答案常用 StringRedisTemplate 和 RedisTemplate。初学和实际项目中更推荐 StringRedisTemplate因为 key 和 value 都以字符串方式处理能避免 JDK 序列化导致的乱码 key。18. StringRedisTemplate 和 RedisTemplate 有什么区别参考答案StringRedisTemplate 默认使用字符串序列化适合存验证码、token、JSON 字符串RedisTemplate 更通用但如果不配置序列化可能出现 key 乱码或对象不可读的问题。19. 对象缓存到 Redis 一般怎么做参考答案常见做法是把对象转换成 JSON 字符串存入 Redis读取时再反序列化为 Java 对象。这样跨语言可读性更好也方便在 Redis 客户端中查看。20. 验证码登录为什么适合用 Redis参考答案验证码有短有效期、高频读写、失效后无须长期保存非常适合 Redis。可以用 login:code:{phone} 作为 key验证码作为 value并设置 5 分钟过期时间。21. 前后端分离项目为什么不建议依赖 Session参考答案前后端分离和分布式部署时浏览器 Session 不方便跨服务共享。更推荐 token Redis登录成功后生成 token把用户信息存 Redis前端后续请求携带 token。22. Redis 共享 Session 的基本流程是什么参考答案用户登录成功后生成 token把用户简要信息保存到 Rediskey 如 login:token:{token}并设置过期时间。前端保存 token每次请求放到请求头后端拦截器读取 token 后到 Redis 查询用户信息。23. 登录 token 为什么要设置过期时间参考答案设置过期时间可以避免长期登录态占用 Redis也能提升安全性。常见做法是登录后设置 30 分钟有效期用户持续访问时刷新 TTL。四、缓存实战与一致性题24. Redis 缓存查询的标准流程是什么参考答案标准流程是先查 Redis命中直接返回未命中查 MySQL数据库查到后写入 Redis 并设置 TTL数据库也没有则根据策略缓存空值或直接返回空。25. 为什么商品详情适合做缓存参考答案商品详情属于读多写少的热点数据用户访问频繁如果每次都查 MySQL会增加数据库压力。放入 Redis 后可以提高响应速度降低数据库负载。26. 缓存和数据库不一致怎么办参考答案常用方案是先更新数据库再删除缓存。这样下次查询时会重新从数据库加载最新数据到缓存。高并发场景可结合延迟双删、消息队列、重试机制等提高可靠性。27. 为什么不推荐先删除缓存再更新数据库参考答案如果先删缓存随后还没更新数据库时有并发查询进来会从数据库读到旧数据并写回缓存导致旧缓存存在较长时间。28. 为什么很多场景选择删除缓存而不是更新缓存参考答案因为更新缓存可能很复杂尤其是缓存数据由多个表组合而来。删除缓存更简单下次查询时自然重建适合大多数读多写少业务。29. 缓存 TTL 为什么建议加随机值参考答案如果大量 key 在同一时间过期可能造成缓存雪崩。给 TTL 加随机值可以打散过期时间降低同一时刻大量请求打到数据库的风险。30. 什么数据适合放 Redis什么数据不适合参考答案适合放可重建、允许短暂不一致、访问频繁、带过期时间的数据不适合放强一致核心数据例如订单最终状态、支付结果等这些必须以数据库为准。五、缓存穿透、雪崩、击穿题31. 什么是缓存穿透参考答案缓存穿透是指查询一个不存在的数据Redis 没有数据库也没有。如果大量请求都查这种不存在的数据就会直接打到数据库。解决方法有参数校验、缓存空值、布隆过滤器。32. 缓存穿透为什么可以缓存空值参考答案当数据库查询结果为空时把空字符串或特殊空对象写入 Redis并设置较短 TTL。下次同样请求直接命中 Redis不再打到数据库。33. 缓存空值有什么缺点参考答案缺点是会占用一部分 Redis 空间而且短时间内如果数据库新增了该数据可能因为空值缓存导致用户暂时查不到所以空值 TTL 应该设置较短。34. 什么是缓存雪崩参考答案缓存雪崩是指大量缓存 key 在同一时间失效导致大量请求同时打到数据库可能压垮数据库。解决方法有 TTL 加随机值、热点预热、多级缓存、限流降级。35. 什么是缓存击穿参考答案缓存击穿是指某个热点 key 突然失效大量请求同时查询这个热点数据导致瞬间都打到数据库。解决方法有互斥锁、逻辑过期、热点预热等。36. 缓存击穿和缓存雪崩的区别是什么参考答案击穿通常是一个热点 key 失效造成的高并发冲击雪崩是大量 key 同时失效造成的大面积冲击。一个是点状热点问题一个是大范围失效问题。37. 互斥锁解决缓存击穿的思路是什么参考答案缓存未命中时只有抢到锁的线程去查数据库并重建缓存其他线程等待或重试。这样可以避免大量请求同时访问数据库。38. 逻辑过期解决缓存击穿的思路是什么参考答案缓存中保存业务数据和逻辑过期时间。发现逻辑过期后先返回旧数据同时尝试加锁让一个线程异步重建缓存。优点是高可用缺点是短时间可能返回旧数据。六、秒杀、Lua 与分布式锁题39. 秒杀业务的核心问题是什么参考答案秒杀核心问题是高并发下防止超卖、防止重复下单并尽量减少数据库压力。常见方案是 Redis 预扣库存、Lua 原子校验、消息队列异步下单、数据库唯一索引兜底。40. 为什么秒杀库存适合放 Redis参考答案秒杀请求量大如果每次都直接查数据库和扣库存数据库容易被压垮。把库存提前加载到 Redis可以用内存操作快速判断和扣减降低数据库压力。41. Lua 脚本在 Redis 中有什么作用参考答案Lua 脚本可以把多条 Redis 命令合并成一个原子操作执行。秒杀中可以用 Lua 同时完成判断库存、判断是否重复下单、扣减库存、记录用户等操作。42. 如何防止秒杀超卖参考答案可以先用 Redis Lua 原子判断库存并扣减再把订单写入队列异步落库。数据库层面还要加乐观锁或库存扣减条件作为最终兜底。43. 如何防止用户重复下单参考答案Redis 中可以用 Set 记录已经下单的用户 idLua 脚本中先判断用户是否存在于集合中如果已存在就拒绝下单。数据库层面可以对 user_id 和 voucher_id 建唯一索引。44. 什么是分布式锁参考答案分布式锁用于解决多个服务实例同时操作同一资源的问题比如多个请求同时给同一个用户创建秒杀订单需要用锁保证同一时刻只有一个线程处理。45. Redis 分布式锁如何实现参考答案常见写法是 SET key value NX EX/PX。NX 表示 key 不存在才设置EX/PX 设置过期时间value 使用唯一标识。释放锁时要判断 value 是不是自己持有再删除。46. 为什么释放锁时要判断 value参考答案因为锁可能已经过期并被其他线程获取。如果不判断 value当前线程可能误删别人的锁导致并发安全问题。47. 为什么释放锁建议使用 Lua参考答案判断 value 和删除 key 是两个操作如果分开执行可能出现并发问题。Lua 脚本可以保证判断和删除在 Redis 中原子执行。48. Redisson 比自己写分布式锁好在哪里参考答案Redisson 封装了可重入锁、看门狗自动续期、公平锁、读写锁等能力减少自研分布式锁的漏洞生产项目更推荐使用。七、消息队列、统计与业务场景题49. Redis 能不能做消息队列参考答案可以但要看场景。List 可以做简单队列Pub/Sub 可以发布订阅Stream 支持消费者组和消息确认更接近消息队列。但复杂生产场景更推荐 RabbitMQ 或 Kafka。50. List 做消息队列有什么问题参考答案List 方案简单但确认机制、消息重试、消费者组能力较弱可靠性不如 Stream 或专业 MQ。51. Pub/Sub 有什么缺点参考答案Pub/Sub 的消息不会持久化如果消费者不在线消息可能直接丢失所以不适合可靠性要求高的业务。52. Stream 相比 List 和 Pub/Sub 有什么优势参考答案Stream 支持消费者组、消息确认、消息 ID、待处理消息列表等机制可靠性更好更适合 Redis 内部实现较可靠的异步任务。53. Redis GEO 适合什么场景参考答案GEO 适合保存经纬度并按距离查询附近对象例如附近商户、附近门店、校园附近服务点。54. Bitmap 适合什么场景参考答案Bitmap 适合记录是否状态例如用户签到。每天一个 bit可以快速统计某月签到次数或连续签到情况。55. HyperLogLog 适合什么场景参考答案HyperLogLog 适合做 UV 去重统计优点是占用内存很小缺点是有少量误差适合访问人数统计这类允许误差的场景。56. 关注关系适合用什么结构参考答案关注关系适合用 Set。可以用 SADD 记录关注用户用 SISMEMBER 判断是否关注用 SINTER 求共同关注。八、主从、哨兵、集群与底层原理题57. Redis 持久化方式有哪些参考答案主要有 RDB、AOF 和混合持久化。RDB 是快照恢复快但可能丢失最后一段数据AOF 记录写命令数据更安全但文件更大、恢复较慢混合持久化兼顾恢复速度和安全性。58. RDB 和 AOF 的区别是什么参考答案RDB 按时间点生成数据快照文件紧凑恢复速度快但可能丢失最近数据AOF 记录写命令日志数据安全性更高但文件可能更大恢复相对慢。59. Redis 主从复制解决什么问题参考答案主从复制主要用于数据备份和读写分离。主节点负责写从节点可以分担读请求提高系统读能力。60. Redis 哨兵 Sentinel 解决什么问题参考答案哨兵负责监控 Redis 主从节点。当主节点宕机时哨兵可以自动选举新的主节点实现故障转移。61. Redis Cluster 解决什么问题参考答案Cluster 主要解决容量扩展和高吞吐问题。它通过 16384 个哈希槽把数据分散到多个节点实现分片存储。62. 主从、哨兵、集群的区别是什么参考答案主从解决复制和读写分离哨兵解决主节点故障自动切换集群解决数据分片和横向扩容。63. Redis 单线程是什么意思参考答案Redis 单线程主要指命令执行线程是单线程的因此避免了多线程锁竞争。Redis 6 以后网络 I/O 可以多线程化但命令执行仍保持顺序性和线程安全。64. Redis 内存满了怎么办参考答案可以配置 maxmemory 和内存淘汰策略。常见策略包括 noeviction、allkeys-lru、volatile-lru、allkeys-random、volatile-ttl 等。实际项目要根据业务选择合适策略。65. 什么是 Pipeline参考答案Pipeline 可以一次发送多条 Redis 命令减少客户端和 Redis 之间的网络往返次数提高批量操作性能。九、项目面试表达模板Redis 在你的项目中怎么用在我的项目中Redis 主要用于登录验证码、token 登录态、热点数据缓存、点赞收藏、排行榜和分布式锁等场景。比如登录时验证码保存到 login:code:{phone}设置 5 分钟过期登录成功后把用户信息保存到 login:token:{token}前端请求携带 token后端从 Redis 获取用户信息。你做商品详情缓存时怎么保证性能我会先查 Redis如果命中直接返回如果未命中再查 MySQL然后把结果写入 Redis 并设置过期时间。对于热点数据会考虑缓存预热、TTL 随机值以及缓存击穿时的互斥锁或逻辑过期。如果面试官问你 Redis 分布式锁怎么说我会说 Redis 分布式锁一般通过 SET key value NX EX 实现NX 保证只有一个线程加锁成功EX 防止死锁value 使用唯一标识防止误删。释放锁时用 Lua 判断 value 后删除生产中更推荐 Redisson因为它有看门狗续期和可重入锁。如果项目里没真正做秒杀怎么回答可以说我学习并设计过秒杀方案活动开始前把库存加载到 Redis请求进来先用 Lua 原子判断库存和一人一单成功后写入队列异步创建订单数据库用唯一索引和乐观锁兜底避免超卖和重复下单。十、面试前快速背诵版Redis 是内存型 NoSQL常用于缓存、验证码、token、排行榜、分布式锁和消息队列。Redis 快的原因内存操作、单线程命令执行、I/O 多路复用、高效数据结构。String 存验证码、token、JSONHash 存对象字段Set 做点赞关注ZSet 做排行榜。缓存查询流程先查 Redis未命中查 MySQL查到后写 Redis 并设置 TTL。缓存穿透查不存在数据解决参数校验、缓存空值、布隆过滤器。缓存雪崩大量 key 同时失效解决TTL 随机值、预热、限流降级。缓存击穿热点 key 失效解决互斥锁、逻辑过期、热点预热。缓存一致性常用方案先更新数据库再删除缓存。分布式锁SET key value NX EX加唯一 value释放锁用 Lua 判断再删除。Redisson 优点可重入、看门狗续期、公平锁、读写锁生产更推荐。秒杀防超卖Redis/Lua 原子扣库存 队列异步下单 数据库唯一索引/乐观锁兜底。主从解决复制和读写分离哨兵解决故障转移集群解决分片扩容。