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

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布隆过滤器

XML 复制代码
<!--guava Google 开源的 Guava 中自带的布隆过滤器-->
<dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>23.0</version>
</dependency>
java 复制代码
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 {

    @Test
    public void test() {
        // 创建一个布隆过滤器 过滤整数值,预计插入元素为100
        BloomFilter<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失效)

  • 差异失效时间,或者不设置失效时间
  • 互斥更新,采用双检加锁策略
相关推荐
岁月变迁呀10 小时前
Redis梳理
数据库·redis·缓存
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭11 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
Code apprenticeship12 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
fpcc14 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
Ewen Seong14 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存
安全二次方security²14 小时前
SMMU软件指南SMMU编程之虚拟机结构和缓存
缓存·cache·smmu·arm安全架构·系统mmu·虚拟机结构·vms
.生产的驴17 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
kong79069281 天前
电商项目-网站首页高可用(二)
缓存·二级缓存·网站首页高可用
一个懒鬼1 天前
Windows脚本清理C盘缓存
windows·缓存
科马1 天前
【Redis】缓存
数据库·redis·spring·缓存