Redis的缓存穿透与缓存雪崩
1、Redis缓存穿透
1.1、什么是Redis缓存穿透?
如果数据库中没有对应的记录,而缓存中也没有对应的记录。而这时有大量的请求恶意放该数据。这样就造成了缓存穿透。
1.2、如何避免缓存穿透?
解决方法一
使用一个空对象,把空的数据也缓存起来。弊端:再缓存中存在很多冗余对象。
解决方法二
使用布隆过滤器
布隆过滤器:判断一个元素是否在一个数组里面,如下图,利用二进制去做的一个存储,占用内存比较小,0 代表不存在,1 代表存在,添加查询效率很快,当保存了一个数值会经过一个算法将对应的值保存到布隆过滤器的集合上的某个位置,某个位置上可能会存在多个key,当传进来一个不存在的key值,和集合进行匹配,如果匹配不上便会返回一个null
当然了,使用布隆过滤器也有相对应的缺点
缺点:
1、1%的误判率,当有一个key不存在布隆数组中,但是由于这个误判率,在某个情况下回判断这个key存在,当这个数组越长误判率越低,数组越短误判率越高。
2、当我们要删除某个key值的时候,是会删除我们的数据库和redis中的内容,但是布隆数组中无法删除,因为数组的某个位置上会存在对个key如果我们要删除的话就是将1变成0,但是会将其中所有的key值都删除。
3.代码复杂度也会增加,因为我们要额外去维护一个集合,当我们使用redis集群,布隆过滤器要和redis结合在一起使用。
2、Redis缓存雪崩
2.1、什么是Redis缓存雪崩?
缓存雪崩,是指在某一时间段会有大量的缓存失效,而这时有大量的请求来访问。这时这些请求,会执行打到数据库上,造成数据库的宕机。 这种现象叫做缓存雪崩。
简单来说:Redis挂掉了,请求全部走数据库。
然而缓存雪崩如果发生了,很可能就把我们的数据库搞垮,导致整个服务瘫痪!
2.2缓存雪崩的过程
2.3、如何预防缓存雪崩?
(1)设置不同的失效时间。
(2)预访问热点数据。
(3)搭建redis的集群。
在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。
事发前:实现Redis的高可用(主从架构+Sentinel 或者Redis Cluster),尽量避免Redis挂掉这种情况发生。
事发中:万一Redis真的挂了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)
事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。