当前位置: 首页 > article >正文

什么是缓存穿透、缓存击穿、缓存雪崩?分别如何解决?

Redis 是一个开源的内存数据存储系统广泛应用于缓存、消息队列等场景。尽管 Redis 在高并发环境下十分高效但在使用过程中可能会遇到缓存穿透、缓存击穿和缓存雪崩等问题。本文将详细介绍这三者的概念及其解决方案并通过 Java 代码示例来加深理解。1. 缓存穿透 (Cache Penetration)概念缓存穿透指的是请求一个根本不存在的数据这种请求绕过了缓存直接打到了数据库上。当大量这样的请求涌来时数据库将承受巨大的压力可能导致数据库崩溃。解决方案布隆过滤器可以利用布隆过滤器在缓存前先进行一个存在性检查如果布隆过滤器中没有这个键则直接返回不会查询数据库。返回错误信息对于无效的请求可以在缓存中保存一个特殊的值如 NULL来标识该数据不存在后续请求直接返回缓存中的标识值避免重复查询数据库。Java 示例代码importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.stereotype.Service;ServicepublicclassCacheService{privatefinalStringRedisTemplateredisTemplate;publicCacheService(StringRedisTemplateredisTemplate){this.redisTemplateredisTemplate;}publicObjectgetData(Stringkey){// 检查布隆过滤器if(!isExistsInBloomFilter(key)){returnnull;// 或返回错误信息}// 从缓存中获取数据StringcachedDataredisTemplate.opsForValue().get(key);if(cachedData!null){returncachedData;}// 缓存中不存在查询数据库ObjectdataFromDbqueryDatabase(key);if(dataFromDbnull){// 数据库中也不存在缓存一个特定的值redisTemplate.opsForValue().set(key,NULL);// 缓存空值}else{// 存在则缓存并返回redisTemplate.opsForValue().set(key,dataFromDb.toString());}returndataFromDb;}privatebooleanisExistsInBloomFilter(Stringkey){// 布隆过滤器检查逻辑// ...returntrue;// 示例}privateObjectqueryDatabase(Stringkey){// 数据库查询逻辑// ...returnnull;// 示例}}2. 缓存击穿 (Cache Breakdown)概念缓存击穿是指某个热点数据在缓存过期后恰好有大量请求涌入这些请求直接查询数据库造成数据库瞬间负载增加。解决方案互斥锁在请求处理时使用分布式锁如 Redis 的 SETNX 命令来保证只有一个线程能够去查询数据库其他线程等待查询结果返回后再一次性写入缓存。提前预热在缓存过期之前定期主动更新缓存保持热点数据的可用性。Java 示例代码importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.stereotype.Service;importjava.util.concurrent.TimeUnit;ServicepublicclassCacheService{privatefinalStringRedisTemplateredisTemplate;publicCacheService(StringRedisTemplateredisTemplate){this.redisTemplateredisTemplate;}publicObjectgetData(Stringkey){StringcachedDataredisTemplate.opsForValue().get(key);if(cachedData!null){returncachedData;}// 缓存中不存在尝试获取锁StringlockKeylock:key;booleanisLockredisTemplate.opsForValue().setIfAbsent(lockKey,1,10,TimeUnit.SECONDS);if(isLock){try{// 重新从数据库中加载数据ObjectdataFromDbqueryDatabase(key);if(dataFromDb!null){redisTemplate.opsForValue().set(key,dataFromDb.toString(),60,TimeUnit.SECONDS);}returndataFromDb;}finally{// 释放锁redisTemplate.delete(lockKey);}}else{// 如果获取不到锁可能有其他线程正在查询数据库稍后重试try{Thread.sleep(100);// 等待一段时间再重试}catch(InterruptedExceptione){Thread.currentThread().interrupt();}returngetData(key);// 再次尝试获取}}privateObjectqueryDatabase(Stringkey){// 数据库查询逻辑// ...returnnull;// 示例}}3. 缓存雪崩 (Cache Avalanche)概念缓存雪崩是指缓存系统中大量缓存同时失效导致大量请求直接访问数据库从而造成数据库的压力剧增甚至崩溃。解决方案设置不同的过期时间为了避免缓存同时失效可以为不同的数据设置不同的超时时间增加缓存的随机性。预热机制在系统启动时提前加载热数据到缓存中以确保始终有数据可用。熔断机制在高并发情况下可以使用限流和熔断来保障服务稳定。Java 示例代码importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.stereotype.Service;importjava.util.concurrent.ThreadLocalRandom;importjava.util.concurrent.TimeUnit;ServicepublicclassCacheService{privatefinalStringRedisTemplateredisTemplate;publicCacheService(StringRedisTemplateredisTemplate){this.redisTemplateredisTemplate;}publicObjectgetData(Stringkey){StringcachedDataredisTemplate.opsForValue().get(key);if(cachedData!null){returncachedData;}// 从数据库查询ObjectdataFromDbqueryDatabase(key);if(dataFromDb!null){// 设置随机的过期时间避免雪崩现象intrandomExpireTime60ThreadLocalRandom.current().nextInt(30);// 60~90秒redisTemplate.opsForValue().set(key,dataFromDb.toString(),randomExpireTime,TimeUnit.SECONDS);}returndataFromDb;}privateObjectqueryDatabase(Stringkey){// 数据库查询逻辑// ...returnnull;// 示例}}最后小结下哈缓存穿透、缓存击穿和缓存雪崩是使用缓存所需考虑的重要问题。通过合理的设计和实现这些解决方案可以有效地提升系统的稳定性和性能尤其在应对高并发场景时。希望本文的介绍和代码示例能对理解和实践有所帮助。

相关文章:

什么是缓存穿透、缓存击穿、缓存雪崩?分别如何解决?

Redis 是一个开源的内存数据存储系统,广泛应用于缓存、消息队列等场景。尽管 Redis 在高并发环境下十分高效,但在使用过程中,可能会遇到缓存穿透、缓存击穿和缓存雪崩等问题。本文将详细介绍这三者的概念及其解决方案,并通过 Java…...

告别古板前端界面,这个 Github 狂揽 8.1万 Star 的 UI 开源项目,让你 AI 生成的 UI 界面审美直接拉满

大家好,我是Java1234_小锋老师。 先说结论:它到底解决什么问题? 如果你经常用 AI 写前端页面,大概率遇到过这种场景: 你说「帮我做一个 SaaS 落地页」,AI 确实能跑起来,但出来的界面总有点「…...

初次在Taotoken模型广场切换不同模型进行文本生成的体验

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初次在Taotoken模型广场切换不同模型进行文本生成的体验 作为一名开发者,初次接触大模型聚合平台时,最关心…...

Python Android打包终极指南:3种架构方案解决跨平台开发痛点

Python Android打包终极指南:3种架构方案解决跨平台开发痛点 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android Python-for-android(简称…...

3步搞定专业显示管理:ColorControl让色彩控制变得如此简单

3步搞定专业显示管理:ColorControl让色彩控制变得如此简单 【免费下载链接】ColorControl Easily change NVIDIA display settings and/or control LG TVs 项目地址: https://gitcode.com/gh_mirrors/co/ColorControl 你是否曾经遇到过这样的烦恼&#xff1f…...

macOS微信防撤回终极指南:3分钟掌握WeChatIntercept完整使用方法

macOS微信防撤回终极指南:3分钟掌握WeChatIntercept完整使用方法 【免费下载链接】WeChatIntercept 微信防撤回插件,一键安装,仅MAC可用,支持v3.7.0微信 项目地址: https://gitcode.com/gh_mirrors/we/WeChatIntercept 还在…...

告别黑屏!手把手教你为OpenEuler 22.03 LTS配置漂亮的XFCE桌面(附LightDM背景修复)

告别黑屏!手把手教你为OpenEuler 22.03 LTS配置漂亮的XFCE桌面(附LightDM背景修复)第一次在OpenEuler上看到XFCE桌面时,那种"服务器变工作站"的惊喜感至今难忘。但默认安装后的黑屏登录界面和简陋的桌面环境&#xff0c…...

电脑里突然冒出的FNPLicensingService.exe是啥?手把手教你关闭它(附Adobe/CAD/Xshell等软件排查指南)

电脑里突然冒出的FNPLicensingService.exe是啥?手把手教你关闭它(附Adobe/CAD/Xshell等软件排查指南)当你打开任务管理器,突然发现一个陌生的进程FNPLicensingService.exe在后台运行,甚至频繁请求联网,这难…...

终极指南:如何用novel-downloader小说下载器批量保存网络小说

终极指南:如何用novel-downloader小说下载器批量保存网络小说 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 你是否曾遇到过这种情况:熬夜追更的小说突然从网…...

AppImageLauncher:3步破解Linux应用安装难题的终极解决方案

AppImageLauncher:3步破解Linux应用安装难题的终极解决方案 【免费下载链接】AppImageLauncher Helper application for Linux distributions serving as a kind of "entry point" for running and integrating AppImages 项目地址: https://gitcode.co…...

开源热物理计算库CoolProp:工程计算与科研分析的强大引擎

开源热物理计算库CoolProp:工程计算与科研分析的强大引擎 【免费下载链接】CoolProp Thermophysical properties for the masses 项目地址: https://gitcode.com/gh_mirrors/co/CoolProp CoolProp是一款开源免费的热物理性质计算库,为工程师、科研…...

SketchUp STL插件:从3D建模到实体打印的完整指南

SketchUp STL插件:从3D建模到实体打印的完整指南 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl SketchUp STL插件…...

如何在SketchUp中实现STL文件导入导出:完整3D打印解决方案指南

如何在SketchUp中实现STL文件导入导出:完整3D打印解决方案指南 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 你…...

5分钟实现Windows三指拖拽:macOS手势体验的终极解决方案

5分钟实现Windows三指拖拽:macOS手势体验的终极解决方案 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th/ThreeFingersDrag…...

ssm大健康老年公寓管理系统(10093)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

ssm出租车投诉管理系统(10092)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

ssm仓库管理信息系统(10091)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

ssm网上订餐系统(10089)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

5分钟部署开源翻译工具:让浏览器变身智能翻译助手

5分钟部署开源翻译工具:让浏览器变身智能翻译助手 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 还在为浏览外文网页时频繁切换翻译工具而烦恼吗&…...

ncmdumpGUI:三步解密网易云音乐NCM文件,实现音乐自由播放

ncmdumpGUI:三步解密网易云音乐NCM文件,实现音乐自由播放 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否在网易云音乐下载了心爱…...

【VibeCoding系列教程05】AI编程工具别瞎选!我用过一遍后,把它们分成了3个段位

我刚用AI做出了人生第一个网页应用,正沉浸在"原来我也能当程序员"的幻觉中。结果第二天我就遇到了一个更头疼的问题——市面上的AI编程工具,多得像超市里的酸奶,看着都差不多,拿起来才发现有的过期了有的加糖太多。有人…...

5分钟快速上手:DouYinBot抖音无水印视频解析工具终极指南

5分钟快速上手:DouYinBot抖音无水印视频解析工具终极指南 【免费下载链接】DouYinBot 该项目仅自用,不提供抖音视频下载 项目地址: https://gitcode.com/gh_mirrors/do/DouYinBot 在短视频创作火爆的今天,你是否曾为抖音视频上的水印而…...

面霸AI · 用 Multi-Agent 让面试模拟卷出天际

🧑‍💻 博主介绍 & 诚邀关注 作者:专注于 Java、Python、前端开发的技术博主 | 全网粉丝 30 万 在校期间协助导师完成毕业设计课题分类、论文格式初审及代码整理工作;工作后持续分享毕设思路,助力毕业生顺利完成…...

如何在5分钟内用VPKEdit一站式管理20多种游戏资源包格式?

如何在5分钟内用VPKEdit一站式管理20多种游戏资源包格式? 【免费下载链接】VPKEdit A CLI/GUI tool to create, read, and write several pack file formats. 项目地址: https://gitcode.com/gh_mirrors/vp/VPKEdit 独立游戏开发者和MOD制作者们,…...

《元创力》纪实录·桥段静默纪元:当叙事成为被审计的风险资产

X54先生叙事前的话:叙事模式:X54先生提供参考角度(可以不选)审查机构事先不对事实审查给了拍摄权和公映权,舆论压力出现,又要倒查,是从一个错误走向另一个错误,这会导致文艺创作者因…...

《元创力》纪实录·卷宗2.1对话态对位法的预习:在“审查通过”与“舆论倒查”之间

叙事背景:最近关于姚晨因《监狱来的妈妈》在国际获奖而微博发声评论引发广泛关注和讨论,由于媒体出现一份判决文书,群众发现《监狱来的妈妈》电影的叙事内容与判决文书不符,引发了舆论声讨,姚晨被迫道歉,删…...

Taotoken 用量看板如何帮助个人开发者管理月度成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken 用量看板如何帮助个人开发者管理月度成本 对于独立开发者而言,在项目开发中调用多个大模型 API 时&#xff0…...

PotPlayer字幕翻译插件:5步实现免费自动化双语字幕体验

PotPlayer字幕翻译插件:5步实现免费自动化双语字幕体验 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 观看外语影视时&…...

诈骗分子利用微软内部账户发垃圾链接,微软能否解决安全漏洞?

诈骗事件曝光 几个月来,诈骗分子利用漏洞,从微软内部通常用于发送合法账户提醒的电子邮件地址发送垃圾邮件。目前不清楚他们如何利用系统,但能像新客户一样创建新微软账户,并以微软名义发邮件,易让人们误以为邮件真实。…...

对比直接使用官方API,通过Taotoken聚合调用的成本体验

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用官方API,通过Taotoken聚合调用的成本体验 1. 从单一模型到聚合调用的成本视角 对于个人开发者或小型团队…...