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/7/30 0:26:22 阅读更多 →
为什么97.3%的提示词迭代失败?——批判性反馈缺失引发的反馈衰减链(附NASA式根因分析模板)

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

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

2026/7/30 0:26:22 阅读更多 →
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/7/30 0:26:22 阅读更多 →

最新新闻

X-AnyLabeling:一站式AI智能标注解决方案,让数据标注效率提升10倍

X-AnyLabeling:一站式AI智能标注解决方案,让数据标注效率提升10倍

X-AnyLabeling:一站式AI智能标注解决方案,让数据标注效率提升10倍 【免费下载链接】X-AnyLabeling Open-source AI-assisted annotation platform for images, videos, text, and multimodal data. 项目地址: https://gitcode.com/gh_mirrors/xa/X-Any…

2026/7/30 0:33:23 阅读更多 →
translate.js:5分钟实现企业级网站国际化的革命性自动化解决方案

translate.js:5分钟实现企业级网站国际化的革命性自动化解决方案

translate.js:5分钟实现企业级网站国际化的革命性自动化解决方案 【免费下载链接】translate AI i18n, Two lines of js realize automatic html translation. No need to change the page, no language configuration file, no API key, SEO friendly! 项目地址:…

2026/7/30 0:33:23 阅读更多 →
小白程序员必看:收藏!如何避免被AI大模型供应商“套牢”?

小白程序员必看:收藏!如何避免被AI大模型供应商“套牢”?

本文探讨了AI模型供应商如何通过价格、工具链嵌入和中断依赖等方式绑定客户。文章指出,企业需警惕对单一模型的过度依赖,并介绍了微软、阿里等企业的应对策略,如自研模型和多模型路由。建议程序员了解这些策略,避免未来被供应商“…

2026/7/30 0:33:23 阅读更多 →
全球高压缩运动服市场未来盈利分析与投资策略建议报告2026年版

全球高压缩运动服市场未来盈利分析与投资策略建议报告2026年版

全球高压缩运动服市场未来盈利分析与投资策略建议报告2026年版高压缩运动服市场概况根据中智信投研究网最新调研报告显示,全球高压缩运动服市场规模2026年将达到2291.9百万美元,预计到2032年将达到3458.9百万美元,在2026-2032年预测期内复合年…

2026/7/30 0:32:23 阅读更多 →
全球氟素离型剂需求现状及发展趋势预测报告2026年版

全球氟素离型剂需求现状及发展趋势预测报告2026年版

全球氟素离型剂需求现状及发展趋势预测报告2026年版素离型剂是一种专门用于高性能薄膜表面的精密防粘处理材料,通过在薄膜上形成一层极薄的化学隔离层,解决强力胶水或硅胶在生产加工中难以轻松剥离的难题。这种材料巧妙地将氟元素的极低表面能与硅材料的…

2026/7/30 0:32:23 阅读更多 →
数据集(Dataset)是由数据所组成的集合,通常以表格形式出现

数据集(Dataset)是由数据所组成的集合,通常以表格形式出现

下面内容摘录自《用R探索医药数据科学》专栏文章的部分内容(原文5873字)。 1篇2章6节:R的数据集读取和利用,如何高效地直接复制黏贴数据到R(20240807 )_r语言 复制数据集-CSDN博客 一、认识数据集 1、数据…

2026/7/30 0:32:23 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻