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

双重检查锁是如何避免缓存雪崩的,代码例子说明

双重检查锁是如何避免缓存雪崩的

  • 什么是缓存雪崩
    • 解决方案
    • 双重检查锁是如何工作的

什么是缓存雪崩

缓存雪崩是指缓存同时失效,造成大量的缓存请求都请求到后端数据库,导致后端系统压力过大而瘫痪的情况。

解决方案

  1. 设置缓存的失效时间为随机值,避免所有缓存同时失效。
  2. 对于缓存的读操作,使用双重检查锁,避免缓存雪崩对后端系统造成过大压力。
  3. 使用缓存预热,将数据预先加载到缓存中。

双重检查锁是如何工作的

双重检查锁是通过减少锁的粒度来避免缓存雪崩的。通常情况下,当多个线程同时请求一个数据,并且这个数据在缓存中不存在时,会导致多个线程同时去数据库中读取这个数据,从而导致数据库负载过高,甚至导致数据库宕机。这种情况就是缓存雪崩。

双重检查锁的解决方案是,在没有缓存数据的情况下,只有一个线程去数据库中读取数据,其他线程都会阻塞在同步块外面,等待第一个线程读取完数据后,再一起返回缓存数据,这样就可以避免缓存雪崩了。

下面是一个代码例子:

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方法中,如果缓存中没有查询到数据,那么它会进入同步块,读取数据,并将数据加入缓存。这样,其他线程在请求数据的时候,就可以直接从缓存中读取数据了,避免了多个线程同时请求数据库的问题。

通过双重检查锁的方式,可以有效的避免缓存雪崩的问题。

如有错误,还请多多指教!
转载或者引用本文内容请注明来源及原作者:橘足轻重;

http://www.lryc.cn/news/1846.html

相关文章:

  • 【成为架构师课程系列】架构设计中的核心思维方法
  • Apollo/Nacos配置动态刷新原理及优劣
  • docker的基本管理
  • 2023年房地产投资-租金和IRR研究报告
  • 2023-2-10刷题情况
  • Python学习-----无序序列2.0(集合的创建、添加、删除以及运算)
  • 2023最详细的接口测试用例设计教程
  • 【数据库】 数据库的理论基础详解
  • Linux环境运行Maven 生成的hadoop jar包
  • ThreadPoolExecutor原理解析
  • 谷粒学苑第二章前端框架-2.2前端框架开发过程
  • 权限管理实现的两种方式(详解)
  • 【C++】智能指针思路解析和模拟实现
  • SpringCloud(18):Sentinel流控降级入门
  • C++【多态】
  • 缓存预热、缓存雪崩、缓存击穿、缓存穿透,你真的了解吗?
  • 【Java基础】018 -- 面向对象阶段项目上(拼图小游戏)
  • 【网络~】
  • 手写JavaScript中的call、bind、apply方法
  • JAVA练习46-将有序数组转换为二叉搜索树
  • linux(centos7.6)docker
  • 微信小程序滚动穿透问题
  • 安全—06day
  • PostgreSQL入门
  • 自媒体人都在用的免费音效素材网站
  • Java数据结构中二叉树的深度解析及常见OJ题
  • 算法顶级比赛汇总
  • Android MVI框架搭建与使用
  • 第九节 使用设备树实现RGB 灯驱动
  • Ubuntu 系统下Docker安装与使用