当前位置: 首页 > 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失效)

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

http://www.mrgr.cn/news/25396.html

相关文章:

  • 牛客小白月赛99(下)
  • Shell脚本-拆分文件并重命名(性能测试)
  • 记一次幸运的漏洞挖掘
  • 植物三萜皂苷生物合成途径及调控机制研究进展-文献精读48
  • 【数据结构-一维差分】力扣1893. 检查是否区域内所有整数都被覆盖
  • Linux和C语言(Day 12)
  • java基于PDF底层内容流的解析对文本内容进行编辑
  • Arduino 2线串行 通信 驱动 LCD 12864
  • 尚硅谷的尚乐代驾项目
  • 【北京迅为】iTOP-i.MX6开发板使用手册第四部分固件编译第十四章非设备树Android4.4系统编译
  • Git 提取和拉取的区别在哪
  • 算法:数字化系统的智慧核心
  • 系统分析师9:公共基础测试题
  • GitLab权限及设置
  • vector的简单实现
  • 核心知识点合集
  • Unity 特殊文件夹
  • 项目管理系统详解:优势、特点及必备工具
  • 软件开发详解:同城O2O系统源码的架构设计与外卖跑腿APP的开发要点
  • Spring部分常见面试题