Redis缓存穿透、缓存击穿缓存雪崩
redis常被用于作为后台数据库的缓存,缓存一些热点访问数据,根据局部性原理,缓存能够处理大部分请求。当请求数据未命中缓存时,才会引起对数据库的访问。
使用redis作为缓存时,存在一些应用问题,包括缓存穿透、缓存击穿、缓存雪崩。
缓存穿透
当有大量查询请求未命中缓存时,引起对后台数据库的频繁访问,导致数据库负载压力增大,这种现象就叫做缓存穿透。
引起的原因:
- 黑客大量访问不存在的key,导致数据库处理大量请求
解决方法:
- 将无效的key存进Redis中,若果数据库查询某个key不存在时,同样将这个key缓存到Redis缓存中,并设置value为NULL,表示不存在。如果攻击请求的key每次都相同,该方法有效;如果攻击请求的key每次随机生成,则同样会产生缓存穿透问题。
- 使用布隆过滤器,过滤掉一些不存在的key。布隆过滤器判定为true时,key可能存在于数据库中,也可能不存在;判定为false时,key一定不存在于数据库。
缓存击穿
当Redis中存在某些极热点数据时,即有大量请求并发访问的key-value数据。当极热点key-value数据突然失效时,缓存未命中引起对后台数据库的频繁访问,这种现象叫缓存击穿。
引起的原因
- 缓存上极热点数据突然失效
解决方法
- 对极热点key设置永不过期
- 使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻访问数据库的请求量,防止数据库崩溃。缺点是会导致系统的性能变差。
缓存雪崩
当某⼀时刻发⽣⼤规模的缓存失效的情况,例如缓存服务宕机、大量key在同一时间过期,这样的后果就是⼤量的请求进来直接打到DB上,可能导致整个系统的崩溃,称为雪崩。如果运维重启宕机的数据库,马上又会有大量新的请求流量到来,再次引起数据库宕机。
可能的原因
- redis宕机、重启
- 大量数据使用了同一过期时间
解决方法
- 引入随机性,在原有缓存失效时间上加上一个随机值,避免大量数据在同一时间失效。
- 通过请求限流、熔断机制、服务降级等手段,降低服务器负载。
- 实现缓存组件的高可用,防止单点故障、机器故障、机房宕机等一系列问题。
- 提高数据后台数据库的容灾能力。
参考
十分钟彻底掌握缓存击穿、缓存穿透、缓存雪崩_mb5fdb099dd338a的技术博客_51CTO博客
原文地址:https://www.cnblogs.com/cwcheng/archive/2022/04/01/16086623.html