干货 | SpringBoot 缓存实战:击穿、穿透、雪崩 通俗解决方案(附可落地代码)
一、前言做 Java 后端开发只要用了 Redis 缓存缓存击穿、缓存穿透、缓存雪崩这三个坑绕不开。面试必问、线上必踩。本文不讲晦涩底层源码用大白话讲原理 SpringBoot 可直接复制的实战代码新手能看懂项目能直接上线用。二、先搞懂三个问题通俗区分1. 缓存穿透特点查不存在的数据直接打穿缓存一直怼数据库比如恶意传-1、id999999Redis 查不到每次都落库查压垮 MySQL。2. 缓存击穿特点热点 Key 突然过期一瞬间大量请求怼数据库比如秒杀爆款商品、首页热点数据Key 统一过期瞬间万条请求直达 DB。3. 缓存雪崩特点大量 Key 同时过期 / Redis 挂了全量请求落库批量缓存集中失效数据库瞬间压力爆炸直接宕机。三、SpringBoot 前置基础依赖 配置1. Maven 依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency2. 基础 Redis 配置spring: redis: host: 127.0.0.1 port: 6379四、逐个解决原理 代码方案 1 解决【缓存穿透】核心思路不存在的数据缓存空值 短期过期接口层加参数校验、黑名单、布隆过滤器进阶实战代码存空值兜底public String getUserInfo(Long userId) { // 1.先查缓存 String key user:info: userId; String cache redisTemplate.opsForValue().get(key); if (StringUtils.hasText(cache)) { return cache; } // 2.查数据库 User user userMapper.selectById(userId); if (user null) { // 不存在缓存空值5分钟过期防止一直打库 redisTemplate.opsForValue().set(key, null, 5, TimeUnit.MINUTES); return null; } // 3.回写缓存 redisTemplate.opsForValue().set(key, JSON.toJSONString(user), 1, TimeUnit.HOURS); return JSON.toJSONString(user); }小白总结查不到就塞个 “空标记”别让恶意请求反复薅数据库。 2 解决【缓存击穿】热点 Key核心思路二选一互斥锁分布式锁过期瞬间只放一个请求查库永不过期热点 Key 长效缓存极简分布式锁方案Redis SetNxpublic String getHotGoods(Long goodsId) { String key goods:hot: goodsId; String lockKey lock:goods: goodsId; // 查缓存 String cache redisTemplate.opsForValue().get(key); if (StringUtils.hasText(cache)) { return cache; } // 加锁只有一个请求能进库 Boolean lock redisTemplate.opsForValue().setIfAbsent(lockKey, lock, 10, TimeUnit.SECONDS); if (!lock) { // 抢不到锁短暂重试/兜底返回 Thread.sleep(200); return redisTemplate.opsForValue().get(key); } try { // 查库回写 Goods goods goodsMapper.selectById(goodsId); redisTemplate.opsForValue().set(key, JSON.toJSONString(goods), 2, TimeUnit.HOURS); return JSON.toJSONString(goods); } finally { // 释放锁 redisTemplate.delete(lockKey); } }小白总结热点数据过期瞬间排队查库不允许万箭齐发捅数据库。 3 解决【缓存雪崩】核心思路过期时间加随机偏移量不让批量 Key 一起死Redis 集群 哨兵防宕机服务层加限流、熔断降级代码过期时间打散关键一行// 原本固定2小时现在 ±30分钟随机 int baseTime 7200; int randomTime new Random().nextInt(1800); redisTemplate.opsForValue().set(key, value, baseTime randomTime, TimeUnit.SECONDS);小白总结给过期时间 “撒胡椒面”避免全缓存集体翻车。五、一张表彻底记牢面试 / 开发通用表格问题原因最简解决方案缓存穿透查不存在数据缓存空值 参数校验缓存击穿热点 Key 集中过期分布式锁 / 热点 Key 永不过期缓存雪崩批量 Key 同时失效 / Redis 挂过期加随机 集群容灾 限流六、文末总结缓存穿透就是有人瞎查不存在的数据一直戳数据库 —— 咱们直接存个空值挡回去缓存击穿就是热门数据刚好过期一瞬间好多请求冲库 —— 加个锁只让一个请求去查库就行缓存雪崩就是一大堆缓存同时到期直接集体掉线 —— 给过期时间加点随机数错开就没事。整篇没搞难懂原理全是能直接复制到项目里用的代码。新手照着写能落地面试背一下也能答上来收藏住以后写缓存直接拿来套用就行
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2480642.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!