优化篇
缓存雪崩 & 击穿 & 穿透问题
面试题分析
这道题主要考察的是求职者是否具有高并发思维,它也是在面试中一道高频的考点
缓存穿透
缓存穿透代表的意思是在我们的缓存中没有找到缓存信息,那么我们在高并发场景下就会面临所有的请求都会直接打到DB,缓存则失去了它原本的意义,并且极有可能导致数据库压力过大而造成服务不可用。
- 缓存空结果信息
- 布隆过滤器(不存在的一定不存在,存在的可能不存在,通过bitmap实现,想深入布隆过滤器可以专门去看看这部分专题内容)
- 过滤常见非法参数,拦截大部分无效请求()
缓存击穿
缓存击穿代表的意思是我们数据库中存在数据,但是缓存中不存在数据.这种场景一般是在缓存失效时发生的. 在高并发的场景下极有可能瞬间打垮数据库.
- 我们可以考虑面对请求量大的热点接口直接将缓存设置永不过期.
- 当然我们也可能碰到一些特殊场景不能设置永久缓存,那么我们可以在db为空时设置互斥锁,当查询完db更新至缓存时再释放锁
缓存雪崩
缓存雪崩代表是意思是我们在某一个时间段,碰到大量热点缓存数据过期导致大量请求直接打垮数据库
- 我们可以考虑面对请求量大的热点接口直接将缓存设置永不过期.
- 缓存过期时间可以设置一个随机的波动值,防止大量数据在同一时间过期
如何解决双写问题?
我们来分析一下这道面试题,这道题主要是偏实际应用的
缓存可以提升性能,减轻数据库压力,在获取这部分好处的同时,它却带来了一些新的问题,缓存和数据库之间的数据一致性问题。
想必大家在工作中只要用了咱们缓存势必就会遇到过此类问题,那这道题该如何回答呢?
首先我们来看看一致性:
- 强一致性
- 弱一致性
解决双写一致性方案:
- 延迟双删
-
- 延迟双删策略是分布式系统中数据库存储和缓存数据保持一致性的常用策略,但它不是强一致。
- 实现思路:也是非常简单的,先删除缓存然后更新DB在最后延迟 N 秒去再去执行一次缓存删除
- 弊端:小概率会出现不一致情况、耦合程度高
- 通过MQ进行重试删除
-
- 更新完DB之后进行删除,如果删除失败则向MQ发送一条消息,然后消费者不断进行删除尝试。
- binlog异步删除
-
- 实现思路:低耦合的解决方案是使用canal。canal伪装成MySQL的从机,监听主机mysql的二进制文件,当数据发生变化时发送给MQ。最终消费进行删除
