Redis高级篇(预热-雪崩-击穿-穿透)

目录

1、缓存预热

2、缓存雪崩

3、缓存穿透

Guava布隆过滤器代码案例

4、缓存击穿


1、缓存预热

什么是缓存预热?

缓存预热,顾名思义,是指在系统启动或某一阶段之前,将一些热点数据提前加载到缓存中,以便在需要时能够快速响应请求。缓存预热旨在避免冷启动或冷缓存带来的性能问题。

如何做缓存预热?

缓存预热的实现方式可以根据具体业务需求和技术架构来选择,例如可以通过定时任务,事先加载特定的数据到缓存中;或者在系统启动时,通过一次性加载所有热点数据到缓存中。

2、缓存雪崩

什么是缓存雪崩?

硬件:Redis宕机

软件:Redis中的key大面积在同一时间过期

如何预防?

1.key永不过期

2.高可用集群

3.多缓存策略(本地缓存+Redis)

4.服务降级

5.云Redis

3、缓存穿透

什么是缓存穿透?

缓存穿透是指在缓存系统中,由于多个缓存对象不在Redis中,导致大量请求直接打到后端数据库,且后端数据库也无该数据,使得数据库压力骤增,甚至导致系统崩溃。

如何预防?

方案一:空对象缓存

1.将不存在的key也回写到Redis(此方法不能预防黑客每次使用不同且不存在的key)

方案二:布隆过滤器

2.Guava

Guava布隆过滤器代码案例

package com.toonyoo.guava;

import com.google.common.hash.BloomFilter;

import com.google.common.hash.Funnels;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class BloomFilterTest {

    public static void main(String[] args) {

        // 创建一个Guava版本的布隆过滤器 Funnels.integerFunnel()表示判断的元素类型为Integer,fpp是误判率(fpp越小越好)

        BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 10000000, 0.01);

        // 判断元素是否存在
        log.info("{}", bloomFilter.mightContain(1));
        log.info("{}", bloomFilter.mightContain(2));

        // 添加元素
        bloomFilter.put(1);
        bloomFilter.put(2);

        // 再次判断元素是否存在
        log.info("{}", bloomFilter.mightContain(1));
        log.info("{}", bloomFilter.mightContain(2));

        
        // fpp是什么? 通过查看源码发现,fpp即误判率,将它的数值设置地越小,误判率越低,同时消耗的资源(bit位数+哈希函数个数)也就越多。
    }

}

4、缓存击穿

什么是缓存击穿?

缓存击穿是指一个热点数据过期或被删除,同时有大量并发请求访问这个热点数据,导致请求直接落到数据库,引发数据库负载激增的情况。

如何预防?

1.对于热点key不设置过期时间

2.互斥更新,才用双检加锁策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值