中年|图解 | 什么是缓存系统“三座大山”?( 二 )
本文插图
说白了就是别让服务彻底死掉就行 , 就像大雪封高速肯定不能通行了 , 堵车慢一些至少可以走 。
3.3 缓存穿透问题 穿透形象一点就是:请求过来了 转了一圈 一无所获 就像穿过透明地带一样 。
在高并发系统中缓存穿透 , 如果一个req需要请求的数据在缓存中没有 , 这时业务线程就会访问磁盘数据库系统 , 然而磁盘数据库也没有这个数据 , 无奈业务线程只能白白处理一圈 。
本文插图
如果某时段有大量恶意的不存在的key的集中请求 , 那么服务将一直处理这些根本不存在的请求 , 导致正常请求无法被处理 , 从而出现问题 。
举个栗子:
拉面馆的服务员和厨师不允许拒绝已经进来的消费者 , 但是拉面馆的经营范围有限 。 此时恶意消费者点了一只5斤的澳洲龙虾 , 经过服务员和厨师都无法响应这个需求 , 此时轮流来了1000个这样的恶意消费者 , 拉面馆基本要歇菜了 。
本文插图
3.4 缓存穿透解决方案 有效甄别是否存在这个key再决定是否读取很重要 , 常见的做法有:
- 把不存在的key写一下 , 这样再来就相当于命中了 , 其实这种方法局限性很大 , 今天是5斤龙虾 , 明天改成6斤的螃蟹 , 缓存系统和数据库中存储大量无用key本身是无意义的 , 所以一般不建议
- 另外一种思路 , 转换为查找问题 , 类似于在海量数据中查找某个key是否存在 , 考虑空间复杂度和时间复杂度 , 一般选用布隆过滤器来实现 。
布隆过滤器也存在一定的误判 , 假如判断存在可能不一定存在 , 但是假如判断不存在就一定不存在 , 因此刚好用在解决缓存穿透的key查找场景 , 事实上很多系统都是基于布隆过滤器来解决缓存穿透问题的 。
本文插图
3.5 缓存击穿问题 缓存击穿是这样一种情况:
由于缓存系统中的热点数据都有过期时间 , 如果没有过期时间就造成了主存和缓存的数据不一致 , 因此过期时间一般都不会太长 。
设想某时刻一批热点数据同时在缓存系统中过期失效 , 那么这部分数据就都将请求磁盘数据库系统 。
本文插图
从描述上来看有点像微小规模的雪崩 , 但是对数据库的压力就很小了 , 只不过会影响并发性能 , 然而在多线程场景中缓存击穿却是经常发生的 , 相反缓存穿透和雪崩频率不如缓存击穿 , 因此研究击穿的现实意义更大一些 。
本文插图
3.6 缓存击穿解决方案 可以采用的方案大概有几种:
- 在设置热点数据过期时间时尽量分散 , 比如设置100ms的基础值 , 在此基础上正负浮动10ms , 从而降低相同时刻出现CacheMiss的key的数量 。
- 另外一种做法是多线程加锁 , 其中第一个线程发现CacheMiss之后进行加锁 , 再从数据库获取内容之后写到缓存中 , 其他线程获取锁失败则阻塞数ms之后再进行缓存读取 , 这样可以降低访问数据数据库的线程数 , 需要注意在单机和集群需要使用不同的锁 , 集群环境使用分布式锁来实现 , 但是由于锁的存在也会影响并发效率 。
推荐阅读
- 中年|Carnot研发新型空气压缩机:噪音更低 寿命更长 成本更低
- 中年|中国-东盟区块链应用创新实验室揭牌
- 中年|交易所成黑钱胜地:“冻卡潮”背后的秘密
- 中年|波卡上线 现阶段是否值得投资?
- 懂懂笔记|主播也拼性价比 除了免坑费降抽成还能拼什么?
- 中年|首台国产T3.20悬臂式掘进机在中信重工下线
- 中年|探索城市的“未来模样”,腾讯政务接下来这么干
- 中年|明年起禁用不可降解塑料购物袋、吸管!塑料袋发明者本来是为拯救地球
- 情感|华为今天如此成功,看一下任正非的岳父是谁,你就知道为什么
- OPPO手机|屏幕素质好是什么体验?三款旗舰机型对比有答案,网友都Pick它