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

缓存预热/雪崩/穿透/击穿

1. 缓存预热

预先将MySQL中的数据同步至Redis的过程

2. 缓存雪崩

Redis主机出现故障,或有大量的key同时过期大面积失效导致Redis不可用

  • Redis中key设置为永不过期,或者过期时间错开
  • Redis缓存集群实现高可用
  • 多缓存结合预防雪崩
  • 服务降级

3. 缓存穿透

每次请求数据Redis上都没有,导致MySQL压力增大,此时Redis形同摆设

  • 空对象缓存或者缺省值

回写增强

如果发生了缓存穿透,我们可以针对要查询的数据,在Redis里存一个和业务部门商量后确定的缺省值(比如,零、负数、defaultNull等)。

比如,键uid:abcdxxx,值defaultNull作为案例的key和value

先去redis查键uid:abcdxxx没有,再去mysql查没有获得 ,这就发生了一次穿透现象。

 

but,可以增强回写机制

 

mysql也查不到的话也让redis存入刚刚查不到的key并保护mysql。

第一次来查询uid:abcdxxx,redis和mysql都没有,返回null给调用者,但是增强回写后第二次来查uid:abcdxxx,此时redis就有值了。

可以直接从Redis中读取default缺省值返回给业务应用程序,避免了把大量请求发送给mysql处理,打爆mysql。

 

但是,此方法架不住黑客的恶意攻击,有缺陷......,只能解决key相同的情况

黑客会对你的系统进行攻击,拿一个不存在的id去查询数据,会产生大量的请求到数据库去查询。可能会导致你的数据库由于压力过大而宕掉。


key相同
第一次打到mysql,
空对象缓存后第二次就返回defaultNull缺省值,
遥免mysql被攻击,不用再到数据库中去走一圈了

key不同
由于存在空对象缓存和缓存回写(看自己业务不限死),
redis中的无关紧要的key也会越写越多(记得设置redis过期时间)

  • 布隆过滤器

Guava布隆过滤器 

<!--guava Google 开源的 Guava 中自带的布隆过滤器-->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version>
</dependency>
package com.example.redis;import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class GuavaBloomFilterTest {@Testpublic void test() {// 创建一个布隆过滤器 过滤整数值,预计插入元素为100BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 100);// 判断指定元素是否存在boolean contain = bloomFilter.mightContain(1);System.out.println(contain);// 将元素新增入布隆过滤器bloomFilter.put(1);contain = bloomFilter.mightContain(1);System.out.println(contain);}
}

4. 缓存击穿

大量请求同时查询一个key时,该key刚好失效,导致大量请求打到数据库上(热点key失效)

  • 差异失效时间,或者不设置失效时间
  • 互斥更新,采用双检加锁策略

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 828华为云征文 | Flexus X的力量,驱动Halo博客在云端飞驰
  • 你都学会栈和队列了赶紧手搓一个对象池吧!!!(超详细,超简单适合新手宝宝学习)
  • 跨系统环境下LabVIEW程序稳定运行
  • CSP-J 之C++常用英文缩写
  • minio的下载和springboot整合minio使用
  • Docker容器技术1——docker基本操作
  • 线性代数 第七讲 二次型_标准型_规范型_坐标变换_合同_正定二次型详细讲解_重难点题型总结
  • 天童教育:课外阅读图书推荐
  • C++20 新特征:概念(Concepts)全面解析
  • Qt实现登录界面
  • Spark的介绍
  • 【高中数学/基本不等式】已知ab皆为正实数,且(a+5b)*(2a+b)=36,求a+2b之最小值?
  • Unet改进30:添加CAA(2024最新改进方法)|上下文锚定注意模块来捕获远程上下文信息。
  • USB摄像头视频流转RTSP流
  • Python | Leetcode Python题解之第401题二进制手表
  • [PHP内核探索]PHP中的哈希表
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Apache Spark Streaming 使用实例
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CentOS7简单部署NFS
  • DOM的那些事
  • Gradle 5.0 正式版发布
  • HomeBrew常规使用教程
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JAVA_NIO系列——Channel和Buffer详解
  • Java应用性能调优
  • session共享问题解决方案
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • WePY 在小程序性能调优上做出的探究
  • 测试开发系类之接口自动化测试
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 开发基于以太坊智能合约的DApp
  • 前端面试总结(at, md)
  • 移动端唤起键盘时取消position:fixed定位
  • 赢得Docker挑战最佳实践
  • 【云吞铺子】性能抖动剖析(二)
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #APPINVENTOR学习记录
  • #git 撤消对文件的更改
  • #php的pecl工具#
  • (09)Hive——CTE 公共表达式
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (BFS)hdoj2377-Bus Pass
  • (C++)八皇后问题
  • (阿里云万网)-域名注册购买实名流程
  • (三)mysql_MYSQL(三)
  • (四)React组件、useState、组件样式
  • (循环依赖问题)学习spring的第九天
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)甲方乙方——赵民谈找工作
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .ai域名是什么后缀?
  • .h头文件 .lib动态链接库文件 .dll 动态链接库