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

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失效)

  • 差异失效时间,或者不设置失效时间
  • 互斥更新,采用双检加锁策略
相关推荐
2301_793086879 小时前
Redis 04 Reactor
数据库·redis·缓存
1892280486113 小时前
NY243NY253美光固态闪存NY257NY260
大数据·网络·人工智能·缓存
青鱼入云14 小时前
redis怎么做rehash的
redis·缓存
FFF-X14 小时前
Vue3 路由缓存实战:从基础到进阶的完整指南
vue.js·spring boot·缓存
夜影风1 天前
Nginx反向代理与缓存实现
运维·nginx·缓存
编程(变成)小辣鸡2 天前
Redis 知识点与应用场景
数据库·redis·缓存
菜菜子爱学习2 天前
Nginx学习笔记(八)—— Nginx缓存集成
笔记·学习·nginx·缓存·运维开发
魏波.2 天前
常用缓存软件分类及详解
缓存
yh云想2 天前
《多级缓存架构设计与实现全解析》
缓存·junit
白仑色3 天前
Redis 如何保证数据安全?
数据库·redis·缓存·集群·主从复制·哨兵·redis 管理工具