中年|图解 | 什么是缓存系统“三座大山”?( 二 )


中年|图解 | 什么是缓存系统“三座大山”?
本文插图

说白了就是别让服务彻底死掉就行 , 就像大雪封高速肯定不能通行了 , 堵车慢一些至少可以走 。
3.3 缓存穿透问题 穿透形象一点就是:请求过来了 转了一圈 一无所获 就像穿过透明地带一样 。

在高并发系统中缓存穿透 , 如果一个req需要请求的数据在缓存中没有 , 这时业务线程就会访问磁盘数据库系统 , 然而磁盘数据库也没有这个数据 , 无奈业务线程只能白白处理一圈 。
中年|图解 | 什么是缓存系统“三座大山”?
本文插图

如果某时段有大量恶意的不存在的key的集中请求 , 那么服务将一直处理这些根本不存在的请求 , 导致正常请求无法被处理 , 从而出现问题 。
举个栗子:
拉面馆的服务员和厨师不允许拒绝已经进来的消费者 , 但是拉面馆的经营范围有限 。 此时恶意消费者点了一只5斤的澳洲龙虾 , 经过服务员和厨师都无法响应这个需求 , 此时轮流来了1000个这样的恶意消费者 , 拉面馆基本要歇菜了 。
中年|图解 | 什么是缓存系统“三座大山”?
本文插图

3.4 缓存穿透解决方案 有效甄别是否存在这个key再决定是否读取很重要 , 常见的做法有:

  • 把不存在的key写一下 , 这样再来就相当于命中了 , 其实这种方法局限性很大 , 今天是5斤龙虾 , 明天改成6斤的螃蟹 , 缓存系统和数据库中存储大量无用key本身是无意义的 , 所以一般不建议
  • 另外一种思路 , 转换为查找问题 , 类似于在海量数据中查找某个key是否存在 , 考虑空间复杂度和时间复杂度 , 一般选用布隆过滤器来实现 。
布隆过滤器是个好东西 , 有非常多的用途 , 包括:垃圾邮件识别、搜索蜘蛛爬虫url去重等 , 主要借助K个哈希函数和一个超大的bit数组来降低哈希冲突本身带来的误判 , 从而提高识别准确性 。
布隆过滤器也存在一定的误判 , 假如判断存在可能不一定存在 , 但是假如判断不存在就一定不存在 , 因此刚好用在解决缓存穿透的key查找场景 , 事实上很多系统都是基于布隆过滤器来解决缓存穿透问题的 。
中年|图解 | 什么是缓存系统“三座大山”?
本文插图

3.5 缓存击穿问题 缓存击穿是这样一种情况:
由于缓存系统中的热点数据都有过期时间 , 如果没有过期时间就造成了主存和缓存的数据不一致 , 因此过期时间一般都不会太长 。
设想某时刻一批热点数据同时在缓存系统中过期失效 , 那么这部分数据就都将请求磁盘数据库系统 。

中年|图解 | 什么是缓存系统“三座大山”?
本文插图

从描述上来看有点像微小规模的雪崩 , 但是对数据库的压力就很小了 , 只不过会影响并发性能 , 然而在多线程场景中缓存击穿却是经常发生的 , 相反缓存穿透和雪崩频率不如缓存击穿 , 因此研究击穿的现实意义更大一些 。
中年|图解 | 什么是缓存系统“三座大山”?
本文插图

3.6 缓存击穿解决方案 可以采用的方案大概有几种: