JAVA专辑Java 核心技术编程语言爱好者

Redis缓存问题

2021-07-25  本文已影响0人  蓝梅

一、缓存穿透

当查询时,key是一个不存在的数据,即不会命中缓存层,也不会命中数据库层,如果,同时大量出现不存在的key则会试数据库压力剧增;一般这种场景在业务代码或数据出现问题时,或者存在恶意攻击、爬虫等造成的空命中;

解决方案:

1.缓存空对象

如果当某个key值命中数据库时,不存在,则缓存 null 到当前key中,后续写入该key时,覆盖null值;
但该方案只能防止正常业务查询出现的数据问题,当存在恶意攻击时,大量的空命中,还是解决不了

2.布隆过滤器

布隆过滤器功能:当某个值经过布隆过滤器时,不存在,则该值肯定不存在;当布隆过滤器结果为存在时,该值可能存在
主要原理,布隆过滤器是一个二进制数组,用0来代表不存在,1来代表存在;然后对当前值进行Hash散列,最后取模,和HashMap取模方式有点相似,再把命中的数组位置,修改为1;
使用布隆过滤器的方案,在程序启动时,把所有key放入布隆过滤器,后续当获取key时,如果布隆过滤器结果为不存在,则直接返回;

二、缓存失效

当保存某一批热点key时,设置了相同的过期时间,当这一批热点key失效时,大量请求都会命中数据库

解决方案:

设置失效时间,使用 固定时间 + 随机时间 来避免热点数据,同时失效

三、缓存雪崩问题

当缓存层宕机后,所有查询都打向后端数据库,导致服务器压力过大

解决方案:

1.保证缓存层的高可用,使用哨兵或集群等提高服务的可用性

但是不管是哨兵还是集群,都会存在宕机时,短暂的不可用,导致查询打向后端数据库

2.服务降级,熔断

可以针对非核心业务进行降级,或者熔断

上一篇 下一篇

猜你喜欢

热点阅读