欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > Java面试第十二山!《Redis缓存》

Java面试第十二山!《Redis缓存》

2025/3/21 20:05:28 来源:https://blog.csdn.net/TFHoney/article/details/146399406  浏览:    关键词:Java面试第十二山!《Redis缓存》

  大家好,我是陈一。如果文章对你有帮助,请留下一个宝贵的三连哦~ 万分感谢!

一、Redis是什么?为什么用它?

Redis(Remote Dictionary Server) 是一个高性能的 内存数据库,支持多种数据结构(如String、Hash、List、Set等),常用于缓存、分布式锁、消息队列等场景。

为什么用Redis?

  • 极速读写:数据存储在内存,比磁盘数据库快100倍以上。
  • 缓解数据库压力:将热点数据缓存到Redis,避免频繁访问数据库。
  • 丰富的数据结构:灵活应对不同业务场景(如排行榜用ZSet)。
  • 高可用:支持主从复制、哨兵、集群模式,保障服务稳定性。

二、Redis核心数据结构与使用场景

数据结构特点典型应用场景示例代码(Java)
String最简单的Key-Value存储缓存验证码、计数器set user:1 "Alice"
Hash存储对象属性用户信息、商品详情hset product:1001 name "Phone" price 5000
List有序、可重复消息队列、最新消息列表lpush news "Update1"
Set无序、去重好友关系、抽奖去重sadd friends:1 "user2" "user3"
ZSet有序、按分数排序排行榜、延迟任务zadd leaderboard 95 "PlayerA"

三、Redis缓存三大经典问题及解决方案

1. 缓存穿透(查不存在的数据)

问题:大量请求绕过缓存,直接访问数据库(如查询ID=-1的数据)。

解决

  • 布隆过滤器:预加载合法Key,拦截非法请求。
  • 缓存空值set key:null " " 300(设置短过期时间)。

2. 缓存雪崩(大量Key同时过期)

问题:缓存集中失效,数据库瞬间压力激增。

解决

  • 随机过期时间expire key 3600 + random(600)
  • 集群部署:Redis Cluster分散节点压力。

3. 缓存击穿(热点Key过期)

问题:某个热点Key失效,大量并发请求直达数据库。

解决

  • 互斥锁:使用setnx命令保证只有一个线程重建缓存。
  • 永不过期:逻辑过期时间 + 异步更新。

四、持久化机制:RDB vs AOF

机制原理优点缺点适用场景
RDB定时生成数据快照文件小,恢复快可能丢失最后一次快照后的数据容灾备份
AOF记录所有写操作命令数据完整性高文件大,恢复慢高数据安全要求场景

生产建议:开启 AOF + RDB 混合模式(Redis 4.0+),兼顾性能与安全。


五、Redis高可用方案

1. 主从复制(Master-Slave)

主节点写,从节点读,数据异步同步。         缺点:主节点宕机需手动切换。

2. 哨兵模式(Sentinel)

  • 自动监控主节点状态,故障自动切换。
  • 架构图:

3. Cluster集群

  • 数据分片存储,支持水平扩展。
  • 每个节点负责一部分槽(slot),通过CRC16算法分配。

六、Java操作Redis实战

1. 客户端选择

  • Jedis:同步阻塞,简单易用。

  • Lettuce(推荐):基于Netty,支持异步、响应式编程,连接可复用。

2. Spring Data Redis整合

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(RedisSerializer.string());template.setValueSerializer(RedisSerializer.json());return template;}
}// 使用注解缓存
@Cacheable(value = "user", key = "#userId")
public User getUserById(String userId) {// 查询数据库
}

注意事项

  • 避免大Key(如超过10KB的String)。

  • 使用连接池配置(如最大连接数、超时时间)。

  • 监控慢查询:slowlog get 10


七、高频面试题整理

1. Redis为什么快?

内存操作、单线程避免竞争、IO多路复用。

2. 如何选择数据结构?

根据业务需求,如统计UV用HyperLogLog。

3. 内存淘汰策略有哪些?

volatile-lru(最近最少使用)、allkeys-random等,共8种策略。

4. 如何实现分布式锁?

setnx + expire 或 RedLock算法。


八、总结

Redis是Java面试必考的高频知识点,掌握其核心概念、数据结构、缓存问题解决方案及高可用架构,能让你在面试中脱颖而出。建议结合实际项目经验(如用Redis优化接口响应时间),并动手实践集群搭建与性能调优。

学习资源推荐

  • 《Redis设计与实现》

  • Redis官方文档:redis.io

  • 在线实验:Redis Labs


翻过这座山,他们就会听到你的故事!转发本文给需要的朋友,一起备战金三银四! 🚀

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词