redis 缓存雪崩
缓存雪崩
redis的热点数据,常常是通过定时任务来刷新的,可能会存在一个问题,同一时间,大面积的热点数据失效,重新拉取。导致数据库压力增大,宕机。
要防止同一时间的大量缓存数据失效,可以缓存时间在上一个随机值的方式来做。
setRedis(Key,value,time + Math.random() * 10000)
如果Redis是集群部署,将热点数据均匀分布在不同的Redis库中也能避免全部失效的问题
或者设置热点数据永远不过期,有更新操作就更新缓存就好了(比如运维更新了首页商品,那你刷下缓存就完事了,不要设置过期时间),电商首页的数据也可以用这个操作,保险。
缓存穿透
穿透是有时候有恶意请求等,不断请求一个缓存和数据库都不存在的key,造成拒绝服务攻击。比如id>1,有人构造了id=0的访问。
可以增加参数的检验,阻止同一个ip的大量请求,在redis中设置不存在的key的缓存(要加上过期时间,防止产生新的数据导致不同步)。
高级玩法是使用布隆过滤器,hash值加载到redis中,存在的放行。布隆过滤器的原理是,使用一个bitmap,默认每个key的值都是0,多次hash算法处理,将每次hash算法得到的index的值改为1。匹配的时候,由于存在hash冲突,多次hash结果都命中的,是可能存在的数据,只要有一次无法命中的,就是不存在的数据。我们只管可能存在的数据,放到缓存中,先访问这个过滤器,存在的在到redis中找数据,没有的到db中找,再存到redis。可能还是会有少部分异常数据通过,这个无关紧要。
缓存击穿
缓存雪崩是大量热点数据失效,缓存击穿是少量热点数据失效,但是该热点数据是频繁访问程度较高,非常热门的数据失效,也导致系统压力徒增。
处理的话可以设置不过期。或者在访问时候加上互斥锁。第一次访问之后,加入到缓存,其他正在等待的请求,会从新的缓存中读取。