Redis 实战:缓存、分布式锁、过期策略、防穿透击穿
Redis 实战缓存、分布式锁、过期策略、防穿透击穿没有缓存的系统就像没有电梯的百层大楼——用户爬到一半就跑了。Redis 就是这部电梯用对了TPS 直接起飞。一、Redis 在 SpringBoot 中的四重身份Redis 不只是个存 key-value 的内存数据库在 SpringBoot 生态中它承担多种角色缓存层挡在数据库前面热点数据毫秒级返回分布式锁多实例环境下保证同一时刻只有一个线程执行关键代码会话管理Spring Session 集成告别粘性会话排行榜/计数器Sorted Set 天然支持排名INCR 原子递增二、SpringBoot 整合 Redis2.1 添加依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency2.2 配置文件spring:data:redis:host:localhostport:6379database:0timeout:3000ms2.3 RedisTemplate 序列化配置默认的 JDK 序列化存在两个问题可读性差一堆乱码且占用空间大。推荐改用 JSON 序列化ConfigurationpublicclassRedisConfig{BeanpublicRedisTemplateString,ObjectredisTemplate(RedisConnectionFactoryfactory){RedisTemplateString,ObjecttemplatenewRedisTemplate();template.setConnectionFactory(factory);// Key 用 String 序列化可读性好template.setKeySerializer(newStringRedisSerializer());// Value 用 JSON 序列化template.setValueSerializer(newGenericJackson2JsonRedisSerializer());template.setHashKeySerializer(newStringRedisSerializer());template.setHashValueSerializer(newGenericJackson2JsonRedisSerializer());returntemplate;}}三、Spring Cache 缓存注解三件套Spring 提供了声明式缓存注解无需手动写 get/set 代码注解作用触发时机Cacheable查缓存有则返回无则查库并放入缓存方法调用前CacheEvict删除缓存方法调用后CachePut强制更新缓存不管 key 是否存在都执行方法并写缓存方法调用后ServicepublicclassUserService{Cacheable(valueuser,key#id)publicUsergetUserById(Longid){// 先查缓存命中直接返回未命中则执行方法并缓存结果returnuserMapper.selectById(id);}CachePut(valueuser,key#user.id)publicUserupdateUser(Useruser){userMapper.updateById(user);returnuser;}CacheEvict(valueuser,key#id)publicvoiddeleteUser(Longid){userMapper.deleteById(id);}}四、缓存三大经典问题穿透、击穿、雪崩这是面试高频题也是生产环境最容易出事故的缓存场景。4.1 缓存穿透场景查询一个数据库中永远不存在的数据比如 id -1每次请求都穿过缓存直接打到数据库。解决方案布隆过滤器在缓存前面加一层布隆过滤器不存在的 key 直接拦截。Redis 4.0 以上支持BF.ADD命令空值缓存把 null 结果也存进缓存设置极短的过期时间如 60 秒Cacheable(valueuser,key#id,unless#result null)publicUsergetUserById(Longid){UseruserredisTemplate.opsForValue().get(user:id);if(user!null)returnuser;// 查数据库useruserMapper.selectById(id);if(user!null){redisTemplate.opsForValue().set(user:id,user,30,TimeUnit.MINUTES);}else{// 空值缓存防止穿透redisTemplate.opsForValue().set(user:id,newUser(),1,TimeUnit.MINUTES);}returnuser;}4.2 缓存击穿场景某个热点 key 在过期的瞬间大量并发请求同时打到数据库。解决方案互斥锁第一个线程获得锁并查库更新缓存其他线程等待逻辑过期不设物理过期值里包含过期时间戳后台线程异步刷新4.3 缓存雪崩场景大量 key 在同一时间过期缓存集体失效数据库瞬间被压垮。解决方案给过期时间加上随机值比如30 分钟 random(1-5 分钟)intrandomMinutesnewRandom().nextInt(5)1;redisTemplate.opsForValue().set(key,value,30randomMinutes,TimeUnit.MINUTES);五、分布式锁从 SETNX 到 Redisson5.1 为什么需要分布式锁单机环境下synchronized或ReentrantLock能搞定并发问题。但服务一部署多个实例JVM 锁就失效了——锁信息不在同一个 JVM 里。这时需要一个所有实例都能访问的公共锁——Redis。5.2 Redisson 分布式锁推荐手写 SETNX 过期时间容易出死锁、误删锁等问题。Redisson 是 Redis 官方推荐的 Java 客户端自带看门狗机制——自动续期防止业务执行时间超过锁过期时间导致锁被误释放。dependencygroupIdorg.redisson/groupIdartifactIdredisson-spring-boot-starter/artifactIdversion3.27.0/version/dependencyServicepublicclassOrderService{AutowiredprivateRedissonClientredissonClient;publicvoiddeductStock(LongproductId){StringlockKeylock:stock:productId;RLocklockredissonClient.getLock(lockKey);try{// 尝试加锁最多等待10秒锁30秒后自动释放if(lock.tryLock(10,30,TimeUnit.SECONDS)){// 查询库存intstockgetStockFromDB(productId);if(stock0)thrownewRuntimeException(库存不足);// 扣减库存updateStock(productId,stock-1);}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}finally{// 判断锁是否仍被当前线程持有再释放防止误删if(lock.isHeldByCurrentThread()){lock.unlock();}}}}看门狗机制tryLock第三个参数是锁过期时间。如果不传使用单参数重载Redisson 默认设 30 秒然后每 10 秒自动续期一次。即便业务执行了 2 分钟锁也不会过期。六、完整示例缓存查询 分布式锁防击穿把缓存和分布式锁结合起来做一道防击穿缓存查询publicUsergetUserByIdWithCache(Longid){StringcacheKeyuser:id;// 1. 先查缓存Useruser(User)redisTemplate.opsForValue().get(cacheKey);if(user!null)returnuser;// 2. 缓存未命中加分布式锁StringlockKeylock:user:id;RLocklockredissonClient.getLock(lockKey);try{if(lock.tryLock(5,10,TimeUnit.SECONDS)){// 3. 双重检查user(User)redisTemplate.opsForValue().get(cacheKey);if(user!null)returnuser;// 4. 查数据库useruserMapper.selectById(id);if(user!null){redisTemplate.opsForValue().set(cacheKey,user,30,TimeUnit.MINUTES);}}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}finally{if(lock.isHeldByCurrentThread())lock.unlock();}returnuser;}七、缓存使用最佳实践总结实践要点说明缓存什么读多写少的数据字典、配置、商品详情不缓存什么实时性要求高、频繁修改、超大对象过期时间热点数据 30min普通数据 5-10min随机偏移防雪崩Key 命名业务:标识:ID如user:info:123统一规范便于管理序列化生产环境用 JSON避免 JDK 序列化的性能和可读性问题监控关注命中率低于 90% 需要排查Redis 用好是银弹用不好是毒药。缓存更新的策略先删缓存还是先更数据库没有银弹根据业务场景选择。分布式锁务必考虑超时和死锁场景Redisson 的看门狗能救你半条命。

相关新闻

AI做B站教程的致命误区:92%新人踩坑的3类违规素材、2种语音模型、1个元数据雷区

AI做B站教程的致命误区:92%新人踩坑的3类违规素材、2种语音模型、1个元数据雷区

更多请点击: https://kaifayun.com 第一章:AI做B站视频教程的合规性总览 在B站(哔哩哔哩)平台发布AI生成的视频教程,需同时满足《网络信息内容生态治理规定》《生成式人工智能服务管理暂行办法》及B站《创作公约》《U…

2026/9/21 15:54:20 阅读更多 →
为什么97.3%的提示词迭代失败?——批判性反馈缺失引发的反馈衰减链(附NASA式根因分析模板)

为什么97.3%的提示词迭代失败?——批判性反馈缺失引发的反馈衰减链(附NASA式根因分析模板)

更多请点击: https://kaifayun.com 第一章:为什么97.3%的提示词迭代失败?——批判性反馈缺失引发的反馈衰减链(附NASA式根因分析模板) 当工程师反复调整提示词却始终无法提升模型输出质量时,问题往往不在提…

2026/9/23 4:18:36 阅读更多 →
MyBatis+MyBatis-Plus 全套 CRUD 数据库实战

MyBatis+MyBatis-Plus 全套 CRUD 数据库实战

MyBatisMyBatis-Plus 全套 CRUD 数据库实战写 SQL 写到怀疑人生?MyBatis-Plus 了解一下——连 XML 都能省掉大半,CRUD 写得像点菜一样简单。一、MyBatis vs MyBatis-Plus:一对亲兄弟 很多新手以为 MyBatis-Plus 是 MyBatis 的替代品&#xff…

2026/9/20 1:45:09 阅读更多 →

最新新闻

vLLM-Omni 新 TTS 模型怎么接?从跑通第一句音频到合入主线的完整实战路径

vLLM-Omni 新 TTS 模型怎么接?从跑通第一句音频到合入主线的完整实战路径

vLLM-Omni 新 TTS 模型怎么接?从跑通第一句音频到合入主线的完整实战路径 【免费下载链接】vllm-omni A framework for efficient model inference with omni-modality models 项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni 你手上有一个 Hug…

2026/9/23 22:11:15 阅读更多 →
Python移动追踪目标检测实战:从YOLO到稳定ID的避坑指南

Python移动追踪目标检测实战:从YOLO到稳定ID的避坑指南

简介:这份资源面向具备一定Python基础、希望入门计算机视觉与人工智能方向的开发者,聚焦视频流中移动目标的定位与追踪问题,可应用于安全监控、自动驾驶、无人机导航等场景。压缩包共2个文件,均为py脚本,整体约3KB&…

2026/9/23 22:11:13 阅读更多 →
COSCon开源年会参会全攻略:从注册到复盘一次搞定

COSCon开源年会参会全攻略:从注册到复盘一次搞定

1. 先搞清楚这年会到底是啥,值不值得你跑一趟1.1 一个把“开源”从口号变成朋友圈的现场每年十月底到十一月初,国内开源圈都会迎来一次大规模线下聚会,这就是 COSCon 中国开源年会。今年是第十届,主办方把会期、场地和议程都做了升…

2026/9/23 22:11:11 阅读更多 →
YOLO红细胞目标检测:标签格式转换与训练调参实战指南

YOLO红细胞目标检测:标签格式转换与训练调参实战指南

简介:面向目标检测入门与进阶人群的YOLO红细胞检测数据集,使用真实场景下的高质量图像构建,包含1000张已标注图片,场景覆盖多种光照和背景条件,可支撑医学影像分析、细胞识别等方向的课程设计、毕业设计或算法预研。数…

2026/9/23 22:11:09 阅读更多 →
非定常气动理论包解析:Theodorsen函数复现与数据验证

非定常气动理论包解析:Theodorsen函数复现与数据验证

简介:泰德森理论是非定常空气动力学中用于分析周期性运动升力的经典解析方法,可计算翼面在非定常气流中的瞬态响应。这一压缩包面向空气动力学专业学生、飞行器设计人员与 MATLAB 仿真爱好者,重点解决二维翼型非定常升力求解、机动飞行与颤振…

2026/9/23 22:11:06 阅读更多 →
SPSS中VIF方差膨胀因子怎么看?一文搞定多重共线性诊断

SPSS中VIF方差膨胀因子怎么看?一文搞定多重共线性诊断

做回归分析时,我最常被同行问的问题之一就是:“SPSS到底在哪里看方差膨胀因子(VIF)?”找了半天,结果表里根本没有这一列。其实不是SPSS不给,而是它默认把这个功能藏起来了,需要在线性…

2026/9/23 22:09:59 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →