缓存雪崩:redis的大量缓存key失效,所有请求直接到数据库,数据库压力激增,导致其他应用服务请求数据库故障,最终引发整个系统服务崩溃。
解决方案:
1、设置key过期时间的时候,增加一个小范围内的随机数,保证不在同一时间内大量失效。
2、设置服务降级策略。
3、在查询缓存时发现失效后查询数据库使用锁的方式减少数据库压力。
缓存击穿:redis中的某一个热点数据失效,同时大量请求进来,最终请求到数据库,数据库压力激增,导致数据库操作长时间阻塞,影响其他服务。
解决方案:
1、对应redis数据,可以不设置过期时间。
2、在查询缓存时发现失效后查询数据库使用锁的方式减少数据库压力。
缓存穿透:redis和数据库都不存在的数据,大量请求访问此类数据,最终也会请求到数据库,数据库压力激增,导致数据库操作长时间阻塞,影响其他服务。
解决方案:
1、直接返回默认值。
2、redis设置空值。
3、使用布隆过滤器过滤此类请求。
布隆过滤器:使用一个大的位数组bitmap和n个hash函数组成,添加一个key时,对这个key进行n个hash函数执行,并将n个hash函数执行的结果位置在bitmap上标记为1,查询时如果n个hash函数对应位置都为1,那么这个key可能存在,如果有一个不为1,则一定不存在。
为什么说都为1时,key可能存在呢,我们来举个例子。
现在有key1、key2和key3三个,假如key1在hash函数上的执行结果为1,3,6,key2在hash函数上的执行结果为2,4,5,key3在hash函数上的执行结果为7,9,10,现在要查询key4,三个hash函数的执行结果为1,5,9,而1,5,9分别是key1,key2,key3在三个hash函数执行时标记为的1,而不是key4,所以说是不一定存在。
布隆过滤器判定不存在时可以百分百的,判定存在时存在一定误差,这个bitmap越大,存在的误差就越小。
可以用来做海量数据去重,所需空间相对其它解决方案要小的多,在海量数据面前,存在小概率的误差是可以接受的。同理,也可以来做垃圾邮件、短信的过滤
布隆过滤器还有一个缺点就是不能删除。