你不知道的redis二-缓存穿透和缓存雪崩问题及解决方案

本文介绍了Redis缓存中常见的三个问题:缓存穿透、缓存雪崩和缓存击穿,以及相应的解决方案。缓存穿透可通过接口层校验、缓存空对象和使用布隆过滤器来缓解;缓存雪崩通过设置高可用Redis和分散过期时间避免;缓存击穿则可采用互斥锁来限制同一时间只有一个请求访问数据库。文中还讨论了布隆过滤器的原理、优缺点及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓存穿透是指存在用户不断地访问缓存和数据库中都没有的数据,从而导致数据库压力过大,从而可能引发服务处理缓慢甚至数据库崩溃等问题。如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者。

解决方式


解决方法很多,一般有以下几种方式

1、接口层校验

接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截,实现比较简单,但是只能拦截部分请求;

2、缓存空对象

从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。 这样可以防止攻击用户反复用同一个id暴力攻击,保护了后端数据源;

存在问题

1、如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;

2、即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

3、布隆过滤器

布隆过滤器是一个bit向量或者bit,如果我们要映射一个值到布隆过滤器中,我们要使用多个不同的哈希函数生成多个哈希值,并将每个生成的哈希值指向的bit位设置为1。

可以看到,不同的词对应的bit位置可能相同,当词很多的情况时,可能大部分bit位置都是1,这时查询商品1可能对应的位置都为1,只能说明商品1一词可能存在,不是一定存在的。

布隆过滤器的巨大用处就是,能够迅速判断一个元素是否在一个集合中。命中的可能存在,但不命中的话肯定不存在!

如Gava给我们提供的布隆过滤器,以下程序实现了生成1000000数据进行初始化布隆过滤器,过滤器误判率为3%,然后故意取10000个不存在布隆过滤器里的值,输出误判数量为300.

public class BloomFilterTest {

private static int size = 1000000;

private static BloomFilter bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, 0.03);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值