缓存穿透、雪崩与击穿

缓存穿透、雪崩、击穿

  • 1、缓存穿透
    • 强调都没有数据+并发访问
    • 布隆过滤器
    • 缓存NULL值
  • 2、缓存雪崩
    • 强调批量Key过期+并发访问
  • 3、缓存击穿
    • 强调单个Key过期+并发访问
    • 互斥锁
    • 逻辑过期
  • 分布式并发控制

1、缓存穿透

缓存穿透是指数据库和缓存都没有的数据,这样缓存永远不会生效,大量的请求有可能导致数据库宕机。

强调都没有数据+并发访问

一般处理缓存穿透有布隆过滤器 和 缓存null值 两种方式。

布隆过滤器

布隆过滤器是使用一个初始全部是0的位数组,插入元素时先哈希一下,把哈希计算出的多个值的对应位置设为1,然后下次再有同样的元素来时先计算一下,如果对应位置的位都是1那就代表有这个元素。这样再去放行访问reids。但布隆过滤器是存在误判的可能性的,因为它走的是哈希思想,只要哈希思想,就可能存在哈希冲突。

缓存NULL值

第二种解决缓存穿透的方式就是:缓存空对象的思想比较简单,查询发现缓存和数据库都没有,就给缓存里加一个空值,下次这个请求再来直接返回缓存的空对象就行。但有个问题就是可能会造成短期内数据的不一致,比如缓存空对象的过期时间为10秒,如果在这10秒内底层数据发生了变化,而缓存层的查询仍然会返回缓存的空对象,就会导致短期内数据不一致。

2、缓存雪崩

缓存雪崩是指,有很多数据,数据库有,但缓存没有(比如同时失效或者Redis服务宕机),导致这些大量的请求不走redis而是直接去查数据库的情况

强调批量Key过期+并发访问

多层级缓存,或者也可以给不同的Key的TTL添加随机值

3、缓存击穿

缓存击穿是指,数据库有,但缓存没有的某个热点数据,突然失效,导致的大量这个key请求不走redis而是直接去查数据库的情况。

强调单个Key过期+并发访问

【之所以会出现这个缓存击穿问题,主要原因是在于我们对key设置了过期时间,假设我们不设置过期时间,其实就不会有缓存击穿的问题,但是不设置过期时间,数据就会一直占用我们内存】
出现这种问题之后,当然是需要把热点数据回写到缓存里,那这就会有并发写的问题。
一般处理方案是1互斥锁,2逻辑过期

互斥锁

只要它们使用同一把锁,就能保障共享资源的正确性和一致性。
互斥锁实现简单,因为仅仅只需要加一把锁,不用其他的操作了,但它只能串行执行,性能肯定受到影响。

逻辑过期

逻辑过期指的是,我们把过期时间设置在value中。假设线程1去查询缓存,从value中判断出来当前的数据已经过期了,那它就会去获得互斥锁,然后专门开启一个新线程11去进行重构数据的逻辑,而线程1此时不等了直接返回过期的旧数据,直到新开的线程完成这个逻辑后,才会释放锁。在这个过程当中如果线程2过来访问,由于线程线程11持有着锁,所以线程2无法获得锁,也直接返回旧数据,只有等到新开的线程11把重建数据构建完后,之后其他线程才能返回正确的数据。
逻辑过期的优点在于它更新缓存的操作是异步进行的,其他线程不用等待。缺点在于在构建完缓存之前,返回的都是脏数据。

分布式并发控制

分布式锁的核心思想在于所有线程都共享同一把锁。

  • 实现的方式是使用redis中的 SET NX命令获取锁,这个命令可以保证互斥性,只有一个线程能够成功获取锁。
    为了避免死锁情况的发生,在线程拿锁的同时也设置锁的过期时间,这样即使系统发生故障也能保证锁在一定时间后自动释放。
  • 还有就是在分布式条件下,可能会出现一些极端情况,【A线程拿到锁然后阻塞了,时间到了之后锁过期被放掉。然后B线程获取到互斥锁开始执行逻辑,A线程这时候恢复了,又继续执行然后把B的锁释放掉】。那为了解决这种情况拿锁的时候存进自己的线程标识,在释放锁时,先验证一下这把锁是不是自己存的,确定后才删除,这样就不会出现删除别的线程锁的情况。
  • 除此之外,会有一个拿锁-比锁-释放的过程,为了避免出现在这个过程还没走完系统宕机或者其他极端情况影响系统的可靠性,拿锁-比锁-释放的代码封装到一个lua脚本里,这样代码执行的时候就能保证它的原子性。
    基于setnx实现的分布式锁存在下面的问题:
    1、主从一致性问题: 如果Redis提供了主从集群,当我们向集群写数据时,主机需要异步的将数据同步给从机,而万一在同步过去之前,主机宕机了,就会出现数据不一致问题。
    2、可重入问题:同一个线程在持有锁的情况下可以继续执行需要获取同一锁的代码,而不会被阻塞。可重入锁有助于避免死锁和提高代码的灵活性。(lua里拿锁,当锁已经存在时,判断传入的线程标识是否相等,如果相等代表就是可重入锁返回1代表获取到了锁,并且重置过期时间)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图形化用户界面-java头歌实训

图形化用户界面 import java.awt.*; import javax.swing.*; public class GraphicsTester extends JFrame { public GraphicsTester() { super("Graphics Demo"); setSize(480, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void paint…

服务器raid5坏盘-换盘-修复阵列过程

目录 背景原因分析解决步骤名词解释进入raid管理界面换回旧4号,进行import再次更换4号盘 总结 背景 服务器除尘之后文件服务器部分文件不能访问了,部分文件夹内容为空,起初以为是新配置的权限的问题,排查之后发现不仅仅是权限问题 jumpserv…

ISA95-标准2-数据字典部分的解析与设计指南

在 MES/MOM 系统中,ISA-95 第二部分的数据字典扮演着至关重要的角色,它确保了数据的一致性和准确性,为不同系统间的数据交换提供了标准化的术语和定义。以下是 MES/MOM 系统实现 ISA-95 第二部分数据字典的具体概念、功能模块以及应用场景: 一、概念、功能模块以及应用场景…

numpy - array(4)

arr1 np.array([[1, 2], [3, 4], [5, 6]]) (1)def insert(arr, obj, values, axisNone) 向array指定位置插入指定值 axis为默认值None时,如果array是多维数据,则先将array转化成向量obj:插入的索引,接受int或者多…

VTK学习日志:基于VTK9.3.0+Visual Studio c++实现DICOM影像MPR多平面重建+V R体绘制4个视图展示功能的实现(二)

前段时间对VTK9.3.0进行了编译,开发了MPRVR实现的demo,显示效果不是很理想,正好趁着周末有时间,再度对之前的程序进行优化和完善,先展示下效果: VTK实现MPRVR四视图 再次讲解下基于VTK的MPRVR实现的简单项目创建过程&a…

linux守护进程生命周期管理-supervisord

简介 supervisor是一个client/server系统,允许用户控制多个类unix系统的进程,摆脱rc.d脚本的不方便性.supervisor具有简单,集中化管理,搞笑,可扩展性,高兼容. 整套软件包含:supervisord(守护进程),supervisorctl(命令行工具),web server(一个web交互界面),XML-RPC 交互 安装 …

git回退commit的方式

在Git中,回退commit(即撤销之前的提交)可以通过多种方式来实现。以下是一些常见的方法,以及它们的详细步骤和注意事项: ### 1. 使用git revert命令 git revert命令用于撤销某次commit,但它并不会删除该comm…

FFmpeg 硬件编码加速文档介绍

介绍 硬件访问:许多平台提供了对专用硬件的访问,这些硬件可以用于执行解码、编码或过滤等视频相关操作。 性能与资源使用:使用硬件可以加快某些操作的速度或减少其他资源(特别是CPU)的使用,但可能会产生不同的结果或质量较低,或带来在使用纯软件时不存在的额外限制。 硬…

公爹公婆出首付买房,离婚的儿媳妇能分吗?

小两口结婚后为了更好地生活打算购房,男方父母帮助支付首付款,后房屋登记在夫妻名下。后两人因感情不和打算离婚,女方要求按照房屋的现行价值进行分割,能否得到支持?近日,江苏省南通市中级人民法院对这起离…

【Postman学习】

Postman是一个非常流行的API开发和测试工具,广泛用于Web服务的开发、测试和调试。它提供了一个图形界面,允许用户轻松地构建、发送和管理HTTP(S)请求,同时查看和分析响应。下面是对Postman接口测试工具的详细解释: 1. Postman简介…

Linux安装Node-RED并实现后台运行及开机启动

首先确保系统中已近成功安装Node.js,并保证需要的合适版本: 关于node.js的安装可以参考我的另一篇博文:《AliyunOS安装Node.js》。 然后就可以使用npm工具安装Node-RED了,很简单使用如下命令: sudo npm install -g --unsafe-per…

【代码随想录算法训练Day53】LeetCode 739.每日温度、LeetCode 496.下一个更大元素、LeetCode 503. 下一个更大元素 II

Day53 单调栈 LeetCode 739.每日温度 经典的单调栈题目&#xff0c;确实的感受到了单调栈的强大之处。 class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;vector<int> res(temperatures.size…

php+redis 生成二维码库

项目场景&#xff1a; 活动报名二维码&#xff0c;生成 30W 的二维码量存放到 redis 中&#xff0c;并通过 redis 读取&#xff0c;以减轻 mysql 数据库的压力。 实现很简单&#xff0c;分为两步&#xff1a; 1、生成&#xff1a;通过 for 循环&#xff0c;以集合方式插入到…

MATLAB使用系统辨识工具箱建立PID水温的传递函数系数

概述 利用PID控制水温&#xff0c;由于实际在工程项目中&#xff0c;手动调节PID参数比较耗费时间&#xff0c;所以可以先利用MATLAB中的Simulink软件建立模型&#xff0c;先在仿真软件上调节大概的PID参数&#xff0c;再利用此PID参数为基础在实际的工程项目中手动调节PID参数…

这些并发编程技术你都知道吗?

与其碌碌无为&#xff0c;不如兴风作浪。 虽然不是所有的系统都需要很多的并发编程技术&#xff0c;但是掌握常见的高并发秘籍&#xff0c;便能让我们的系统快起来&#xff0c;面对访问量的剧增从容应对。 接下来&#xff0c;为我们一起来看看常见的高并发技术有哪些。总结起来…

SSH版本升级-openssh-9.7p1

SSH版本升级-openssh-9.7p1 1、查看当前版本2、安装openssl2.1、编译安装ssl 3、下载新版本SSH4、备份原有的SSH配置5、上传文件并解压6、卸载原有的openssh包7、编译安装openssh7.1、在解压后的目录&#xff0c;初始化openssh7.2、将文件拷回7.3、修改配置文件 最终实现&#…

linux系统中给java 应用配置开机自动启动

第一步需要一个控制java应用启动&#xff0c;停止&#xff0c;重启的脚本&#xff0c;脚本内容如下&#xff0c;我是springboot应用&#xff0c;其他的可以根据情况改写. #!/bin/bashAPP_NAME/data/oa/start-2.0.jar #执行命令有误时&#xff0c;提示使用说明参数 usage() {ec…

DDD学习笔记五

模型引力场&#xff1a;聚合 强作用力体现&#xff1a; 某个领域模型是另一些模型存在的前提&#xff0c;没有前者&#xff0c;后者就失去了生存的意义。 一组领域模型之间存在关联的领域逻辑&#xff0c;任何时候都不能违反。 一组领域模型必须以一个完整的、一致的状态呈现给…

CSDN写文章时需要上、下标字号怎么输?

上标&#xff1a;​^^&#xff0c;符号中间加字 下标&#xff1a;~~&#xff0c;符号中间加字 前题是用MD编辑器&#xff0c;不然白搭&#xff1a; 我是感觉CSDN这个文本编辑比较拉&#xff0c;非常想吐槽。

dB分贝入门

主要参考资料&#xff1a; dB&#xff08;分贝&#xff09;定义及其应用: https://blog.csdn.net/u014162133/article/details/110388145 目录 dB的应用一、声音的大小二、信号强度三、增益 dB的应用 一、声音的大小 在日常生活中&#xff0c;住宅小区告知牌上面标示噪音要低…