Skip to content

Spring集成Redis面试题库 ​

生成时间:2026-05-24 20:18


【面试题】1. Redis的ZSet数据结构底层是如何实现的?适合什么场景? ​

【标准答案】ZSet底层有两种编码方式:元素少时用ziplist(紧凑连续内存),元素多时用skiplist+hashtable组合。skiplist支持O(logN)的有序插入和范围查询,hashtable支持O(1)的成员查找。典型场景:排行榜(游戏积分榜)、延迟队列(时间戳作为score)、带权重的任务调度。Spring Data Redis用opsForZSet().add(key, value, score)操作,取TOP N用reverseRangeWithScores。

【面试题】2. Redis的RDB和AOF有什么区别?生产环境怎么选? ​

【标准答案】RDB是定时快照,文件小、恢复快,但有数据丢失风险(两次快照间的数据丢失);AOF是追加写日志,数据更安全但文件大、恢复慢。生产环境推荐混合持久化:RDB做基础备份,AOF记录增量,既保证恢复速度又减少数据丢失。配置aof-use-rdb-preamble yes,AOF重写时先写RDB格式,再追加AOF。如果对数据丢失零容忍,用AOF everysec;如果更关注恢复速度,用RDB+定时备份。

【面试题】3. 什么是缓存穿透?Spring Boot项目中如何解决? ​

【标准答案】缓存穿透指查询不存在的数据,缓存和数据库都没有,导致每次请求都穿透到数据库。解决方案有两种:①布隆过滤器(Guava或Redisson实现):启动时加载所有有效key,请求前先判断key可能存在才查库;②空值缓存:查询为空也缓存,设置短TTL(如5分钟)。Spring Boot实现:用@Cacheable(cacheNames="user", unless="#result==null"),空结果不缓存需手动处理;或用Redisson的RBitSet实现布隆过滤器。推荐组合使用,布隆过滤器挡大部分恶意请求,空值缓存兜底。

【面试题】4. Redisson分布式锁的看门狗机制是什么?为什么要这个设计? ​

【标准答案】看门狗是为了解决锁超时问题。设置锁过期时间太短,业务没执行完锁就释放,可能被其他线程抢占;时间太长,服务宕机锁无法及时释放。看门狗机制:Redisson给锁默认30秒,后台线程每隔10秒(1/3的过期时间)自动续期,业务执行完释放锁。核心代码:RLock lock = redisson.getLock("myLock"); lock.lock();,lock()不传过期时间就启用看门狗。注意:只在加锁机器存活时续期,宕机看门狗也停,锁自动过期释放,避免死锁。

【面试题】5. Spring Cache的@Cacheable注解中condition和unless有什么区别? ​

【标准答案】condition在方法执行前判断,决定是否走缓存;unless在方法执行后判断,决定是否缓存结果。典型用法:condition="#id>0"表示只有id>0才查缓存;unless="#result==null"表示结果为null不缓存。两者可以组合:@Cacheable(cacheNames="user", condition="#id>0", unless="#result.status=='INACTIVE'")。注意:condition返回true才执行方法并缓存,false直接执行方法不查缓存也不缓存结果;unless只影响是否缓存,不影响查询缓存和执行方法。

【面试题】6. Redis Cluster的16384个槽位是怎么分配和迁移的? ​

【标准答案】Cluster把所有key分成16384个槽,每个节点负责一部分槽位。key的槽位计算:CRC16(key) % 16384。客户端连接任一节点,请求的key不在此节点返回MOVED重定向。槽位迁移:用redis-cli reshard命令,迁出节点执行CLUSTER SETSLOT <slot> IMPORTING,迁入节点执行CLUSTER SETSLOT <slot> MIGRATING,迁移过程中用ASK重定向。迁移不影响服务:迁出节点负责迁移期间的所有请求,数据迁移用MIGRATE命令原子性转移。Spring Boot配置:spring.redis.cluster.nodes=node1:6379,node2:6379,node3:6379,Lettuce自动重定向。

【面试题】7. 缓存和数据库双写一致性有哪些方案?各有什么优缺点? ​

【标准答案】三种主流方案:①Cache Aside(旁路缓存):读时先查缓存,miss再查库并回填;写时先更新库再删缓存。优点是简单可靠,缺点是有短暂不一致窗口。②Write Through:写时同步更新缓存和数据库,像操作单一存储。优点是强一致,缺点是写性能差。③Write Behind:先写缓存,异步批量写数据库。优点是写性能极高,缺点是有数据丢失风险。生产环境推荐Cache Aside+延迟双删:更新数据库后删缓存,延迟几百毫秒再删一次,防止并发读脏数据。更高要求用Canal监听binlog异步更新缓存,实现最终一致性。

【面试题】8. 用Redis实现接口限流有哪些算法?如何保证原子性? ​

【标准答案】四种主流算法:①固定窗口:INCR key计数,用EXPIRE设置窗口,简单但有临界突变问题;②滑动窗口:ZSet存储时间戳,ZREMRANGEBYSCORE清理过期记录,ZCARD统计,精确但内存开销大;③令牌桶:Lua脚本实现"获取令牌+判断+扣减"原子操作,允许突发流量;④漏桶:按固定速率处理请求,用ZRANGE按时间戳排序。推荐用Redisson的RRateLimiter,内部用Lua脚本保证原子性,Spring Boot直接注入使用:rateLimiter.tryAcquire(1, 1, TimeUnit.SECONDS)。关键:限流判断必须原子,用Lua或Redisson,不能分开执行多个命令。

【面试题】9. Redis的Stream和Pub/Sub有什么区别?什么场景用Stream? ​

【标准答案】Pub/Sub是实时广播,消息不持久化,客户端离线就丢失;Stream是持久化消息队列,支持消费者组、消息确认、历史回溯。Stream核心命令:XADD写入、XREADGROUP消费、XACK确认、XPENDING查看未确认消息。适用场景:消息需要可靠投递(如订单处理)、需要消费者组负载均衡、需要回溯历史消息。Spring Data Redis用StreamMessageListenerContainer消费Stream,配置消费者组:StreamOffset.create("mystream", ReadOffset.lastConsumed())。Pub/Sub适合实时推送、缓存失效通知等允许丢失的场景。

【面试题】10. Redis的BigKey问题是什么?如何排查和拆分? ​

【标准答案】BigKey指单个key的value过大:String超过10KB、集合元素超过5000个、List/Hash/ZSet成员过多。危害:网络带宽占用、主线程阻塞、过期删除耗时长、集群迁移慢。排查方法:用MEMORY USAGE key查看内存占用,用redis-cli --bigkeys扫描,用DEBUG OBJECT key看编码。拆分方案:①String大字段:压缩后分片存储,或转Hash结构;②大集合:按业务维度拆分,如用户关注列表拆成user:follow:1、user:follow:2多个key;③分桶存储:key加上桶编号,如order:202401:01到order:202401:10。预防:设计时控制单个key大小,用Hash代替大String,定期扫描清理。


本轮题目覆盖知识点:

  • ZSet数据结构底层编码与场景选型
  • RDB/AOF持久化原理与生产实践
  • 缓存穿透问题与布隆过滤器实现
  • Redisson分布式锁看门狗机制
  • Spring Cache注解详解
  • Redis Cluster槽位分配与迁移
  • 缓存与数据库双写一致性方案
  • Redis限流算法与原子性保证
  • Stream消息队列与Pub/Sub对比
  • BigKey排查与拆分最佳实践