缓存常见问题及解决方式

缓存常见问题
由于引入缓存首先需要考虑的就是缓存更新的方式,之前在缓存更新的几种模式中我们介绍过 。除了这个问题还有一些常见的问题,整理出一个表格,如下图所示:
缓存问题
产生原因
解决方案
缓存不一致
同步更新失败、异步更新
最终一致
【缓存常见问题及解决方式】缓存穿透
恶意攻击
空对象缓存、布隆过滤器
缓存击穿
热点key失效
互斥更新、随机退避、
缓存雪崩
缓存挂掉
快速失败熔断、主从模式、集群模式、差异失效时间
大key
存储value很大、集合数据过多、数据未清理
拆分key,清理key
热点key
预期外的访问量陡增,如突然出现的爆款商品
对key进行rehash然后复制到不同集群,使用读写分离架构
数据不一致一致性问题
数据不一致的问题,可以说只要使用缓存,就要考虑如何面对这个问题 。缓存不一致产生的原因一般有两方面:
选择缓存更新模式的不同造成的不一致,例如[缓存更新的几种模式]的Cache Aside不管是先更新db还是先删除或更新cache,在高并发的情况下都有可能造成不一致的情况,只是不同的更新方式造成不一致的概率不一样,尽可能的选择造成不一致概率最小的更新模式 。系统问题导致失败造成的不一致,在这里就是如缓存服务的机器宕机,网络异常造成的更新失败等 。解决方案采用强一致性协议,很少使用 。最终一致性,在绝大部分场景中,特别是互联场景下,大多是保证最终一致性 。重试机制mq 更新数据库,若这一步就失败,更新事务失败回滚 。更新缓存失败,将失败的数据写入mq 消费mq得到失败的数据,重新删除缓存 订阅数据库binlog[参考MySQL复制原理及应用canal] , 解耦缓存更新过程 。缓存穿透问题
产生这个问题的原因可能是外部的恶意攻击,例如 , 对用户信息进行了缓存,但恶意攻击者使用不存在的用户id频繁请求接口,导致查询缓存不命中,然后穿透 DB 查询依然不命中 。这时会有大量请求穿透缓存访问到 DB,增加数据库压力甚至导致系统宕机 。
解决方案业务上做非法参数的校验,尽量避免非法请求打到缓存 。对不存在的用户 , 在缓存中保存一个空对象进行标记 , 防止相同 ID 再次访问 DB 。不过有时这个方法并不能很好解决问题,可能导致缓存中存储大量无用数据 。使用 BloomFilter 过滤器,BloomFilter 的特点是存在性检测,如果 BloomFilter 中不存在,那么数据一定不存在;如果 BloomFilter 中存在,实际数据也有可能会不存在 。非常适合解决这类的问题 。布隆过滤器
下面简单介绍下布隆过滤器,布隆过滤器内部维护一个bitArray(位数组) ,  开始所有数据全部置 0。当一个元素过来时,能过多个哈希函数来实现负载均衡,还要考虑从节点数量显著增加后带来故障率增加的问题 。Redis集群架构变更会为监控、运维、故障处理带来了更大的挑战 。
以上就是朝夕生活(www.30zx.com)关于“缓存常见问题及解决方式”的详细内容 , 希望对大家有所帮助!

猜你喜欢