Redis缓存穿透+缓存雪崩+缓存击穿的原因和解决⽅案
⽬录
在⽣产环境中,会因为很多的原因造成访问请求绕过了缓存,都需要访问数据库持久层,虽然对Redsi缓存服务器不会造成影响,但是数据 库
的负载就会增⼤,使缓存的作⽤降低
⼀、缓存穿透
缓存穿透是指查询⼀个根本不存在的数据,缓存层和持久层都不会命中。在⽇常⼯作中出于容错的考虑,如果从持久层查不到数据则不 写
⼊缓存层,缓存穿透将导致不存在的数据每次请求都要到持久层去查询,失去了缓存保护后端持久的意义
缓存穿透⽰意图:
缓存穿透问题可能会使后端存储负载加⼤,由于很多后端持久层不具备⾼并发性,甚⾄可能造成后端存储宕机。通常可以在程序中统计总调
⽤数、缓存层命中数、如果同⼀个Key的缓存命中率很低,可能就是出现了缓存穿透问题。
造成缓存穿透的基本原因有两个。第⼀,⾃⾝业务代码或者数据出现问题(例如:set 和 get 的key不⼀致),第⼆,⼀些恶意攻击、爬
⾍等造成⼤量空命中(爬取线上商城商品数据,超⼤循环递增商品的ID)
解决⽅案:
1.
缓存空对象
缓存空对象:是指在持久层没有命中的情况下,对key进⾏set (key,null)
缓存空对象会有两个问题:第⼀,value为null 不代表不占⽤内存空间,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间,
⽐较有效的⽅法是针对这类数据设置⼀个较短的过期时间,让其⾃动剔除。第⼆,缓存层和存储层的数据会有⼀段时间窗⼝的不⼀致, 可能
会对业务有⼀定影响。例如过期时间设置为5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不⼀ 致,此
时可以利⽤消息系统或者其他⽅式清除掉缓存层中的空对象
2.
布隆过滤器拦截
在访问缓存层和存储层之前,将存在的key⽤布隆过滤器提前保存起来,做第⼀层拦截,当收到⼀个对key请求时先⽤布隆过滤器验证是
key否存在,如果存在在进⼊缓存层、存储层。可以使⽤bitmap做布隆过滤器。这种⽅法适⽤于数据命中不⾼、数据相对固定、实时性低的
应⽤场景,代码维护较为复杂,但是缓存空间占⽤少。
布隆过滤器实际上是⼀个很长的⼆进制向量和⼀系列随机映射函数。布隆过滤器可以⽤于检索⼀个元素是否在⼀个集合中。它的优点 是
空间效率和查询时间都远远超过⼀般的算法,缺点是有⼀定的误识别率和删除困难。
算法描述:
初始状态时,BloomFilter是⼀个长度为m的位数组,每⼀位都置为0。
添加元素x时,x使⽤k个hash函数得到k个hash值,对m取余,对应的bit位设置为1。
评论0
最新资源