Skip to content

本轮 Spring集成Redis面试题库(带答案)

【面试题】1. Redis的String数据结构底层编码有哪些?什么场景会触发编码转换? ​

【标准答案】String有三种底层编码:int、embstr、raw。int存储整数且值在Long范围内;embstr存储短字符串(≤44字节),内存连续分配;raw存储长字符串(>44字节),SDS与内存分开分配。编码转换由Redis自动触发:int值变为非整数时转为raw;embstr修改后转为raw。开发时优先用int和embstr,内存效率更高。

【面试题】2. Redis持久化选型:RDB和AOF各自的适用场景是什么?生产环境怎么组合? ​

【标准答案】RDB适合备份、迁移、重启恢复快的场景,文件小、恢复快,但可能丢失最后一次bgsave后的数据。AOF适合数据完整性要求高的场景,最多丢1秒数据,但文件大、恢复慢。生产推荐混合持久化:先RDB快照+再AOF追加,重启时先加载RDB再增量回放AOF,兼顾恢复速度和数据完整性。

【面试题】3. Redis内存淘汰策略有哪些?volatile-lru和allkeys-lru的区别是什么? ​

【标准答案】共8种策略。noeviction不淘汰直接报错;volatile-lru只淘汰设置了过期时间的LRU键;allkeys-lru淘汰所有键的LRU;volatile-lfu/allkeys-lfu类似,用LFU频率淘汰;volatile-random/allkeys-random随机淘汰;volatile-ttl淘汰TTL最短的。volatile-lru适合缓存场景且有热点键需长期保留;allkeys-lru适合纯缓存无明确过期时间的场景。

【面试题】4. Redis主从复制的psync2机制相比旧版全量同步有什么改进? ​

【标准答案】psync2支持部分重同步:主节点记录复制偏移量和runid,断线重连时从节点带上偏移量请求,主节点检查backlog缓冲区是否包含断线期间的命令,若完整则只传缺失部分,避免全量同步。全量同步只在backlog不足或runid变化时触发。生产调优:增大repl-backlog-size降低全量同步概率。

【面试题】5. Spring Data Redis的RedisTemplate序列化策略怎么选?JdkSerializationRedisSerializer有什么问题? ​

【标准答案】JdkSerializationRedisSerializer用Java序列化,存储二进制,跨语言不兼容、可读性差、有安全风险。StringRedisSerializer适合简单字符串键值。Jackson2JsonRedisSerializer支持JSON,但需指定类型。推荐GenericJackson2JsonRedisSerializer:自动带类型信息,反序列化正确还原对象,跨语言兼容,存储可读。配置时Key用StringRedisSerializer,Value用GenericJackson2JsonRedisSerializer。

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

【标准答案】condition在方法执行前判断,决定是否走缓存逻辑,为false则直接执行方法且不缓存结果。unless在方法执行后判断,决定是否将结果写入缓存,为true则不缓存。典型用法:condition="#id > 100"只缓存ID大于100的;unless="#result == null"空结果不缓存。组合使用可实现精细化缓存控制。

【面试题】7. 缓存穿透用布隆过滤器怎么实现?有什么注意事项? ​

【标准答案】布隆过滤器是一种空间高效的概率数据结构,能判断元素"一定不存在"或"可能存在"。实现流程:启动时将合法Key预热到布隆过滤器;查询时先查布隆过滤器,返回不存在则直接返回空;返回可能存在则查缓存/数据库。注意事项:有误判率需调优参数;不支持删除需用计数布隆过滤器或定期重建;布隆过滤器本身也要持久化避免重启重建。

【面试题】8. Redisson分布式锁的看门狗机制解决了什么问题?锁超时时间怎么设置合理? ​

【标准答案】看门狗解决锁超时误释放问题:持有锁的线程可能执行时间超过锁的TTL,导致锁提前释放被其他线程抢占。Redisson默认每10秒(lockWatchdogTimeout/3)检查锁是否仍持有,若持有则续期30秒,直到主动释放。超时时间设置:业务最大执行时间的1.5-2倍,同时开启看门狗兜底。不依赖看门狗时需手动合理设置TTL避免误删。

【面试题】9. Redis Stream相比List做消息队列有什么优势?消费者组怎么保证消息可靠性? ​

【标准答案】Stream支持消费者组(XGROUP)、消息确认(XACK)、pending列表查看未确认消息、消息ID单调递增、支持阻塞读取(XREADGROUP)。List需手动实现确认机制。可靠性保证:消费者用XREADGROUP读取,处理成功后XACK确认;失败的消息留在PEL列表可重新投递;可通过XPENDING查看未确认消息并XCLAIM重新分配给其他消费者处理。

【面试题】10. Redis Cluster的16384槽位是怎么分配的?节点故障时槽位如何迁移? ​

【标准答案】16384槽位均匀分配到各主节点,每个主节点负责一段连续槽位范围。客户端缓存槽位映射表,Key通过CRC16(key) % 16384计算归属槽位。节点故障时:哨兵机制检测客观下线后触发故障转移;从节点升级为主节点接管原主节点的槽位;其他节点更新槽位映射表;客户端收到MOVED错误后刷新映射表继续访问。手动迁移用CLUSTER SETSLOT命令。