摘要:但是缓存和在实现强一致性时必然存在同步时间差。在系统启动时将需要保证强一致性的数据载入缓存,所有操作和查询只修改缓存,缓存的数据可以异步的同步到。
在使用缓存系统并且在系统存在高并发的情况下(可能要求强一致性),可能出现如下问题:
1. 缓存穿透
缓存穿透是指,查询的数据并不存在于缓存系统中导致必须查询DB的情况。
缓存穿透可能被利用作为系统攻击的点。例如:重复查询系统之不存在的key(不存在于缓存和DB)
解决思路:
如果查询的key不存在于缓存系统中那么,在缓存系统中增加此key,并且将值置为null(或其他的特殊值,此值代表缓存系统尚未收录),然后查询DB并更新至缓存系统。如果此key不存在于系统中,则将此key在缓存中置为特殊值(此特殊值表示系统不存在此值)
2.缓存并发
缓存高并发是指,在并发重复的大量请求缓存数据时,如果缓存系统不存在此key(可能时攻击也可能不是),那么将导致大量的重复请求首先引起缓存穿透问题,其次极大增加DB的压力,在此场景下缓存失去了应有作用。
缓存并发也可能被利用作为系统攻击点。除了上述的缓存穿透之外,也可能导致DB拒绝服务。例如:发送大量DB有但是缓存没有的数据(存在于DB不存在于缓存)
解决思路:
如果查询的是同一key,则加锁处理;如果查询时不同key则队列处理
3.缓存失效
缓存失效是指,给某些有时效性的缓存内容设定过期时间,到达过期时间之后,对应缓存失效了。简单拓展,缓存内容在没有被及时更新也是缓存失效,一般我们需要缓存的数据在我们修改DB的时候会同步修改缓存。
如果设定缓存失效时间都是一致的,那么会导致,在同一时间大量缓存失效,这时候如果有大量请求请求失效缓存则造成缓存穿透和缓存并发问题。
解决思路:
控制缓存失效时间,不让缓存在同一时间失效,失效时间对应不同的key设置随机时间失效,将请求分配到多个时间中减轻DB压力
4.缓存强一致性要求
缓存强一致性是指,缓存和DB是的操作时同步的。但是缓存和DB在实现强一致性时必然存在同步时间差。
解决思路:
首先我们需要保证我们的缓存系统时高可用的。在系统启动时将需要保证强一致性的数据载入缓存,所有操作和查询只修改缓存,缓存的数据可以异步的同步到DB。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/61974.html
摘要:为了保证缓存的一致性,缓存控制器跟踪每一个缓存行的状态,这些状态的数量是有限的。用来表示在体系中响应其他缓存的特定缓存。如今,内存控制器的流量使用一个单独的总线来传输。用于缓存段的缓存控制器记录了哪个核心可能改变自己的缓存行。 即使是资深的技术人员,我经常听到他们谈论某些操作是如何导致一个CPU缓存的刷新。看来这是关于CPU缓存如何工作和缓存子系统如何与执行核心交互的一个常见误区。本文...
摘要:马蜂窝推荐系统对于请求的平均处理时延要求在级别,时延的线保持在以内。任务队列与异步写入这里我们使用了中的线程池来实现。三优化方向基于和,我们在现有的推荐系统中增加了一个本地容灾缓存系统,当依赖服务或者应用本身突发异常时可以返回缓存的数据。 数据库突然断开连接、第三方接口迟迟不返回结果、高峰期网络发生抖动...... 当程序突发异常时,我们的应用可以告诉调用方或者用户「对不起,服务器出了...
摘要:马蜂窝推荐系统对于请求的平均处理时延要求在级别,时延的线保持在以内。任务队列与异步写入这里我们使用了中的线程池来实现。三优化方向基于和,我们在现有的推荐系统中增加了一个本地容灾缓存系统,当依赖服务或者应用本身突发异常时可以返回缓存的数据。数据库突然断开连接、第三方接口迟迟不返回结果、高峰期网络发生抖动...... 当程序突发异常时,我们的应用可以告诉调用方或者用户「对不起,服务器出了点问题」...
摘要:从视角理解系统结构连载关注我的微博链接了解最新动态从我的前一篇博文中我们知道了缓存及缓存行的概念同时用一个例子说明了编写单线程代码时应该注意的问题下面我们讨论更为复杂而且更符合现实情况的多核编程时将会碰到的问题这些问题更容易犯连包作者大师的 从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态 从我的前一篇博文中, 我们知道了CPU缓存及缓存行的概念, 同时用一个例子说...
阅读 890·2023-04-26 01:37
阅读 3367·2021-09-02 15:40
阅读 953·2021-09-01 10:29
阅读 2887·2019-08-29 17:05
阅读 3416·2019-08-28 18:02
阅读 1180·2019-08-28 18:00
阅读 1483·2019-08-26 11:00
阅读 2601·2019-08-26 10:27