Redis的缓存雪崩、穿透和击穿
缓存雪崩
缓存本来可以抗住高峰期的大量请求、但缓存机器发生意外全盘宕机,导致大量请求全部落在数据库,数据库崩溃。
解决方案:
1、限流组件、设置每秒的请求,允许一部分的请求落在数据库,剩余未通过的请求降级,或者返回一些空值或者友情提示。
缓存穿透
客户端请求缓存和数据库中不存在的数据,导致所有请求打在数据库上
解决方案:
1、如果是相同的不存在请求,在数据库中只要没查到,就写一个空值到缓存里,然后设置一个过期时间,这样相同的key来访问时,在缓存失效前就可以直接从缓存中取数据(但是这种对长时间且每次请求不一样的攻击不管用)
2、做好参数检验,对于不合理的参数要及时return结束
3、(经常做法)设置布隆过滤器,将数据库中所有可能的数据哈希映射到布隆过滤器中,然后对每个请求进行判断:
请求的数据不存在于布隆过滤器中,可以确定数据一定不在数据库中,系统可以立即返回不存在
请求的数据存在于布隆过滤器中,则继续再向缓存中查询。
缓存击穿
某个key特别热点,访问非常频繁,当这个缓存key在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在数据库中击穿了一个洞
解决方案:
1、如果缓存的数据基本不更新,可以将热点数据设置为永不过期
2、如果缓存数更新不频繁,并且缓存刷新时间耗时较少,可以利用redis等分布式中间件的分布式互斥锁,保证只有少量的请求能够请求数据库并且重新构建缓存,其余线程在锁释放后访问新缓存。
3、如果缓存更新频繁并且耗时较长,可以利用定时线程在缓存过期前主动的重新构建缓存或者延后缓存的过期时间,保证所有的请求能一直访问到对应的缓存
标签:缓存,请求,过期,数据库,Redis,过滤器,数据 From: https://www.cnblogs.com/-Cooper/p/17147565.html