Redis 缓存数据库 缓存击穿/缓存穿透/缓存雪崩

一、缓存穿透
1.1 产生原因
1.2 解决方法
接口校验
对空值进行缓存
使用布隆过滤器
实时监控
二、缓存雪崩
2.2 解决方法
将失效时间分散开
给业务添加多级缓存
构建缓存高可用集群
使用锁或者队列的方式
设置缓存标记
三、缓存击穿
3.2 解决方法
使用互斥锁
”提前“使用互斥锁 / 逻辑过期
提前对热点数据进行设置
监控数据,适时调整
3.3 实现
1 互斥锁
测试
2 逻辑过期
一、缓存穿透
1.1 产生原因
客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会访问数据库。导致DB的压力瞬间变大而卡死或者宕机。

大量的高并发的请求打在redis上
这些请求发现redis上并没有需要请求的资源,redis命中率降低
因此这些大量的高并发请求转向DB请求对应的资源
DB压力瞬间增大,直接将DB打垮,进而引发一系列“灾害”
缓存穿透发生的场景一般有两类:

原来数据是存在的,但由于某些原因(误删除、主动清理等)在缓存和数据库层面被删除了,但前端或前置的应用程序依旧保有这些数据;
恶意攻击行为,利用不存在的Key或者恶意尝试导致产生大量不存在的业务数据请求。

1.2 解决方法
接口校验
类似于用户权限的拦截,对于id = -3872这些无效访问就直接拦截,不允许这些请求到达Redis、DB上。

对空值进行缓存
比如,虽然数据库中没有id = 1022的用户的数据,但是在redis中对其进行缓存(key=1022, value=null),这样当请求到达redis的时候就会直接返回一个null的值给客户端,避免了大量无法访问的数据直接打在DB上。

但需要注意:

key设置的过期时间不能太长,防止占用太多redis资源,设置一个合适的TTL,比如两三分钟。
当遇到黑客暴力请求很多不存在的数据时,就需要写入大量的null值到Redis中,可能导致Redis内存占用不足的情况。
使用布隆过滤器

布隆过滤器的基本原理:使用BitMap结构和多个哈希函数,向其中加入数据x xx时,将h a s h 1 ( x ) hash_1(x)hash
1

(x)、h a s h 2 ( x ) hash_2(x)hash
2

(x)、h a s h 3 ( x ) hash_3(x)hash
3

(x)等位置的bit值置为1。查询时,如果相应的位置均为1,则认为该数据存在于布隆过滤器中。性能较高但也有缺点:

可能会存在误判,使用时误判率可以作为参数进行设置,其实是调节了这个过程中使

缓存穿透缓存击穿缓存雪崩是常见的缓存问题,下面是关于Redis缓存穿透缓存击穿缓存雪崩的介绍: 1. 缓存穿透缓存穿透是指当一个请求查询一个不存在于缓存中的数据时,由于缓存无法命中,请求会直接访问数据库。这种情况下,如果有大量的请求查询不存在的数据,会导致数据库压力过大,影响系统性能。 2. 缓存击穿缓存击穿是指当一个热点数据的缓存过期或失效时,大量的请求同时访问该数据,导致缓存无法命中,请求会直接访问数据库。这种情况下,数据库会承受巨大的压力,可能导致数据库崩溃。 3. 缓存雪崩缓存雪崩是指当缓存中的大量数据同时过期或失效时,大量的请求会直接访问数据库,导致数据库压力剧增,性能下降甚至系统崩溃。缓存雪崩通常是由于缓存服务器故障、缓存设置不合理或者缓存数据过期时间设置不当等原因引起的。 为了避免缓存穿透缓存击穿缓存雪崩问题,可以采取以下措施: - 缓存穿透:可以在应用层对查询的数据进行校验,如果数据不存在,则不进行缓存操作,避免大量无效的请求访问数据库。 - 缓存击穿:可以互斥锁或分布式锁来保护热点数据的问,当缓存失效时,只允许一个请求访问数据库并更新缓存,其他请求等待缓存更新完成后再从缓存中获取数据。 - 缓存雪崩:可以采用多级缓存缓存预热、设置合理的缓存过期时间等策略来避免大量缓存同时失效,保证系统的稳定性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值