Redis缓存问题:缓存穿透,缓存击穿,缓存穿透

1.1缓存穿透

概念:请求的数据在缓存和数据库中均不存在,导致所有的请求都直接到达数据库,从而导致数据库压力增大。

经典场景:

无效请求:用户请求的数据在数据库中不存在

恶意攻击:发送大量不存在的请求

解决方案:

  1. 缓存空数据,查询返回的结果为空,仍把这个空结果缓存

    优点:简单

    缺点:消耗内存;当数据更新时,查询数据不一致

  2. 布隆过滤器,拦截不存在的数据,不存在,直接返回

    存储数据:在一个以二级制为单位的数组中,布隆过滤器可以检索一个元素是否在一个元素中(通过多个hash函数获取hash值,在对hash值进行计算数组对应的位置改为1,数组数据初始化都为0)

    查询数据:使用相同的hash函数获取hash值,判断对应位置都为1

    优点:内存占比少,没有多余的key

    缺点:实现复杂,存在误判(误判率:数组越大,误判率越小,但是内存消耗越大)(不存在的数据在进行hash函数获取hash值时,取得位置与存在数据重合)

1.2缓存击穿

概念:某一或少量key过期,在这个时间点对这个key有大量的并发请求,这些请求直接到达数据库,可能压垮DB

解决方案:

        1.互斥锁,查询缓存未命中时,获取互斥锁,在此线程完成数据重建,写入缓存,释放锁。

优缺点:强一致,性能差

        2.逻辑过期,查询缓存时,逻辑时间过期,获取互斥锁并开启新线程,在新线程中进行数据重建以及重置逻辑过期时间,在原线程中依旧返回旧数据,直至新线程释放锁,才获取新数据(数据重建的数据)。

优缺点:高可用,性能优,不能保证数据绝对一致

注意:逻辑过期并不是数据真的消失,只是逻辑上的过期

1.3缓存雪崩

概念:在同一时间大量的key请求失效或者服务器宕机,导致请求全部到达数据库

解决方案:

        1.给不同的key设置随机TTL

        2.给业务添加多级缓存或添加限流机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值