双重检查锁是如何避免缓存雪崩的,代码例子说明
双重检查锁是如何避免缓存雪崩的
- 什么是缓存雪崩
- 解决方案
- 双重检查锁是如何工作的
什么是缓存雪崩
缓存雪崩是指缓存同时失效,造成大量的缓存请求都请求到后端数据库,导致后端系统压力过大而瘫痪的情况。
解决方案
- 设置缓存的失效时间为随机值,避免所有缓存同时失效。
- 对于缓存的读操作,使用双重检查锁,避免缓存雪崩对后端系统造成过大压力。
- 使用缓存预热,将数据预先加载到缓存中。
双重检查锁是如何工作的
双重检查锁是通过减少锁的粒度来避免缓存雪崩的。通常情况下,当多个线程同时请求一个数据,并且这个数据在缓存中不存在时,会导致多个线程同时去数据库中读取这个数据,从而导致数据库负载过高,甚至导致数据库宕机。这种情况就是缓存雪崩。
双重检查锁的解决方案是,在没有缓存数据的情况下,只有一个线程去数据库中读取数据,其他线程都会阻塞在同步块外面,等待第一个线程读取完数据后,再一起返回缓存数据,这样就可以避免缓存雪崩了。
下面是一个代码例子:
public class Data {private volatile static Data instance;private Map<String, Object> cache = new HashMap<>();private Data() {}public static Data getInstance() {if (instance == null) {synchronized (Data.class) {if (instance == null) {instance = new Data();}}}return instance;}public Object getData(String key) {Object value = cache.get(key);if (value == null) {synchronized (Data.class) {value = cache.get(key);if (value == null) {value = readFromDb(key);cache.put(key, value);}}}return value;}private Object readFromDb(String key) {// 从数据库中读取数据return key;}
}
在这个例子中,第一层if语句的作用是判断实例是否已经被创建,如果没有被创建,那么第二层if语句就会创建一个实例。当第一个线程试图创建实例时,它会首先锁定Data.class对象,然后在这个同步块中判断实例是否已经被创建,如果没有,那么就创建实例。后续的线程也只能在这个同步块外面等待,等待第一个线程创建完实例。
在getData方法中,如果缓存中没有查询到数据,那么它会进入同步块,读取数据,并将数据加入缓存。这样,其他线程在请求数据的时候,就可以直接从缓存中读取数据了,避免了多个线程同时请求数据库的问题。
通过双重检查锁的方式,可以有效的避免缓存雪崩的问题。
如有错误,还请多多指教!
转载或者引用本文内容请注明来源及原作者:橘足轻重;
相关文章:
双重检查锁是如何避免缓存雪崩的,代码例子说明
双重检查锁是如何避免缓存雪崩的什么是缓存雪崩解决方案双重检查锁是如何工作的什么是缓存雪崩 缓存雪崩是指缓存同时失效,造成大量的缓存请求都请求到后端数据库,导致后端系统压力过大而瘫痪的情况。 解决方案 设置缓存的失效时间为随机值࿰…...
【成为架构师课程系列】架构设计中的核心思维方法
架构设计中的核心思维方法 目录 前言 #一、抽象思维 #二、分层思维 #三、分治思维 #四、演化思维 #五、如何培养架构设计思维...
Apollo/Nacos配置动态刷新原理及优劣
一. 配置方式 这里只说与Spring集成后的配置方式,这也是项目中主要使用的方式 Apollo 在属性上直接加value注解,这个属性就会随着配置的更改动态更新类实现ConfigChangeListener,在类中方法上ApolloConfigChangeListener注解,注解…...
docker的基本管理
Docker的概念云计算三层架构服务说明应用IAAS基础设施及服务硬件(服务器、网络设置、防火墙等)虚拟化网络虚拟化(大二层)例:openstackPAAS平台及服务环境例:数据库、 docker 、kubernetesSAAS应用及服务应用…...
2023年房地产投资-租金和IRR研究报告
第一章 概况 房地产投资租赁是指置业投资者在购买到物业后,首先对该物业进行适当整饰与装修,之后以出租人的身份,以口头协议或签订合同的形式,将房屋交付承租人占有、使用与收益,由承租人向出租人交付租金的行为。通过…...
2023-2-10刷题情况
青蛙过河 题目描述 小青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里 的石头跳到对岸。 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上。 不过, 每块石头有一个高度, 每次小青蛙从一块石头起跳, 这块石头的高度就 会下降 1 , 当石头…...
Python学习-----无序序列2.0(集合的创建、添加、删除以及运算)
目录 前言: 什么是集合 集合的三大特性 1.集合的创建 (1)直接创建 (2)强制转换 2.集合的添加 (1)add()函数 (2)update() 函数 3.集合元…...
2023最详细的接口测试用例设计教程
一、接口测试流程 1、需求讨论 2、需求评审 3、场景设计 4、数据准备 5、测试执行 二、分析接口文档元素 1、接口名称 2、接口地址 3、支持格式 4、请求方式 5、请求参数(参数名称、类型、是否必填、参数说明等) 6、返回参数(返回…...
【数据库】 数据库的理论基础详解
目录 一, 什么是数据库 二, 数据库管理系统(DBMS) 三,数据库与文件系统的区别 1,对比区别: 2,优缺点总结: 四,数据库的发展史 五,常见数据库 1, 关系型…...
Linux环境运行Maven 生成的hadoop jar包
运行命令: hadoop jar ./jar包名字 class对象路径 输入路径 输出路径 linux内部jar包测试 cd 到以下目录,创建以下文件夹 [rootreagan180 ~]# cd /opt/soft/hadoop313/share/hadoop/mapreduce/ 创建文件夹(读取路径) [roo…...
ThreadPoolExecutor原理解析
1. 工作原理1.1 流程图1.2 执行示意图从上图得知如果当前运行的线程数小于corePoolSize(核心线程数),则会创建新线程作为核心线程来执行任务(注意,执行这一步需要获取全局锁)。如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQue…...
谷粒学苑第二章前端框架-2.2前端框架开发过程
一、前端框架开发过程 第一步:添加路由 src/router模块用来管理路由。 第二步:点击某个路由,显示路由对应页面内容 component: () > import(/views/table/index), 表示路由对应的页面,是views/table/index.vue页面 第三步&a…...
权限管理实现的两种方式(详解)
登录的接口请求的三个内容:1. token2. 用户信息、角色信息3. 菜单信息第一种:基于角色Role的动态路由管理 (不推荐,但市场用的比较多)首先列出枚举每个角色对应几个路由,然后根据用户登录的角色遍历枚举出来的角色动态注册对应的路…...
【C++】智能指针思路解析和模拟实现
此篇文章就从以下几个方面出发,带你了解智能指针的方方面面1.为什么需要智能指针当我们开辟内存并使用的时候,我们的顺序应该是这样:开辟内存-》使用内存-》释放内存问题就出现在第三步,开辟好了,也使用了,…...
SpringCloud(18):Sentinel流控降级入门
Sentinel本地应用流控降级实现分为三步: 创建本地应用搭建本地Sentinel控制台本地应用接入本地Sentinel控制台1 本地应用创建 整体流程分析 创建springboot项目在项目的pom.xml文件中引入sentinel-core的依赖坐标创建TestController,定义使用限流规则运行测试具体流程 1.创…...
C++【多态】
文章目录1、多态的概念2、多态的定义及实现2-1、多态的构成条件2-2、虚函数2-3、虚函数的重写2-4 多态样例2-5、协变2-6、 析构函数与virtual2-7、函数重载、函数隐藏(重定义)与虚函数重写(覆盖)的对比2-8、override 和 final&…...
缓存预热、缓存雪崩、缓存击穿、缓存穿透,你真的了解吗?
缓存穿透、缓存击穿、缓存雪崩有什么区别,该如何解决? 1.缓存预热 1.1 问题描述 请求数量较高,大量的请求过来之后都需要去从缓存中获取数据,但是缓存中又没有,此时从数据库中查找数据然后将数据再存入缓存…...
【Java基础】018 -- 面向对象阶段项目上(拼图小游戏)
目录 拼图小游戏(GUI) 一、主界面分析 1、练习一:创建主界面1 2、练习二:创建主界面2(JFrame) 3、练习三:在游戏界面中添加菜单(JMenuBar) ①、菜单的制作 4、添加图片&a…...
【网络~】
网络一级目录二、socket套接字三、UDP数据报套接字四、TCP流套接字一级目录 1.局域网、广域网 2.IP地址是什么? IP地址是标识主机在网络上的地址 IP地址是如何组成的? 点分十进制,将32位分为四个部分,每个部分一个字节ÿ…...
手写JavaScript中的call、bind、apply方法
手写JavaScript中的call、bind、apply方法 call方法 call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。 function Product(name, price) {this.name name;this.price price; }function Food(name, price) {Product.call(this, name, price);t…...
Uvicorn与Scaleway Serverless Functions:无服务器Python应用部署终极指南
Uvicorn与Scaleway Serverless Functions:无服务器Python应用部署终极指南 【免费下载链接】uvicorn An ASGI web server, for Python. 🦄 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn Uvicorn作为Python生态中最快、最现代的ASGI…...
消费级显卡也能跑!cv_resnet101_face-detection_cvpr22papermogface GPU算力适配实战
消费级显卡也能跑!cv_resnet101_face-detection_cvpr22papermogface GPU算力适配实战 1. 项目简介与核心价值 今天给大家分享一个特别实用的人脸检测工具——基于MogFace模型的高精度人脸检测系统。这个工具最大的亮点就是消费级显卡就能流畅运行,不需…...
Qwen2.5-Coder-1.5B新手指南:如何用‘fill-in-the-middle’模式补全代码
Qwen2.5-Coder-1.5B新手指南:如何用‘fill-in-the-middle’模式补全代码 重要提示:Qwen2.5-Coder-1.5B是一个专门用于代码任务的预训练模型,不适合直接用于对话。它最擅长的场景是代码补全、生成和修复,特别是使用"fill-in-t…...
如何快速学习Web安全:DVWA-Chinese完整教程指南
如何快速学习Web安全:DVWA-Chinese完整教程指南 【免费下载链接】DVWA-Chinese DVWA全汉化版本 项目地址: https://gitcode.com/gh_mirrors/dv/DVWA-Chinese 想要在安全领域快速成长?DVWA-Chinese就是你的最佳Web安全测试平台!作为全球…...
从一次调试失败讲起:用示波器和IBERT深度排查FPGA JESD204B时钟与SYSREF问题
从一次调试失败讲起:用示波器和IBERT深度排查FPGA JESD204B时钟与SYSREF问题 那是一个周五的深夜,实验室里只剩下示波器的荧光在闪烁。我们团队精心设计的JESD204B数据采集系统突然在联调时出现随机失锁——ADC与FPGA之间的链路像被施了魔法一样时通时断…...
Homebrew国内镜像源对比:如何为MacOS M2快速安装Pandoc并配置Typora
Homebrew国内镜像源深度评测:M2 Mac高效安装Pandoc与Typora配置指南 作为Markdown写作的重度用户,我曾在M1 Pro和M2 Max芯片的MacBook上反复折腾Pandoc的安装过程。最令人头疼的不是软件本身,而是Homebrew那令人抓狂的下载速度——有时一个简…...
LeetCode 3548. 等和矩阵分割2 详细题解(前缀和+二分+连通性分析)
LeetCode 3548. 等和矩阵分割2 详细题解(前缀和二分连通性分析) 🏷️ 标签:前缀和、二分查找、连通性、哈希表、矩阵、周赛难题 📊 难度:中等 | 📝 题目编号:3548 | 🗂️…...
2026年高性价比个人网盘盘点:告别“空间焦虑”,谁才是真正的效率神器?
在预算有限的情况下寻找个人网盘,大多数人的第一反应是打开计算器,算出“每 GB 只要几分钱”。但作为一个在存储行业摸爬滚打多年的老兵,我要告诉你一个反直觉的事实:对于 90% 的办公族和学生来说,网盘的“空间大小”是…...
LFM2.5-GGUF开源模型部署指南:适配消费级GPU的高性能文本生成方案
LFM2.5-GGUF开源模型部署指南:适配消费级GPU的高性能文本生成方案 1. 平台介绍 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型,专为消费级GPU环境优化设计。这个1.2B参数的模型采用GGUF格式,能够在资源有限的设备上高效运…...
5款Umi-OCR插件全解析:让文字识别效率提升300%的实用指南
5款Umi-OCR插件全解析:让文字识别效率提升300%的实用指南 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins 为什么你的文字识别总是效率低下? 还在为图片转文字耗时过长而抓狂&am…...
