软考2019高级架构师下午案例分析第4题:关于双写不一致、缓存穿透、缓存雪崩

【说明】

​ 某初创企业的主营业务是为用户提供高度个性化的商品订购业务,其业务系统支持 PC 端、手机 App 等多种访问方式。系统上线后受到用户普遍欢迎,在线用户数和订单数量迅速增长,原有的关系数据库服务器不能满足高速并发的业务要求。

​ 为了减轻数据库服务器的压力,该企业采用了分布式缓存系统,将应用系统经常使用的数据放置在内存,降低对数据库服务器的查询请求,提高了系统性能。在使用缓存系统的过程中,企业碰到了一系列技术问题。

【问题1】

​ 该系统使用过程中,由于同样的数据分别存在于数据库和缓存系统中,必然会造成数据同步或数据不一致性的问题。该企业团队为解决这个问题,提出了如下解决思路:应用程序读数据时,首先读缓存,当该数据不在缓存时,再读取数据库;应用程序写数据时,先写缓存,成功后再写数据库;或者先写数据库,再写缓存。

​ 王工认为该解决思路并未解决数据同步或数据不一致性的问题,请用 100 字以内的文字解释其原因。

​ 王工给出了一种可以解决该问题的数据读写步骤如下:

​ 读数据操作的基本步骤:

​ 1.根据 key 都缓存;

​ 2.读取成功则直接返回;

​ 3.若 key 不在缓存中时,根据 key(a);

​ 4.读取成功后,(b);

​ 5.成功返回。

​ 写数据操作的基本步骤:

​ 1.根据 key 值写(c);

​ 2.成功后(d);

​ 3.成功返回。

​ 请填写完善上述步骤中(a)~(d)处的空白内容。

答案:

存在双写不一致问题,在写数据时,可能存在缓存写成功,数据库写失败,或者反之,从而造成数据不一致。当多个请求发生时,也可能产生读写冲突的并发问题。

(a)从数据库中读取数据或读数据库

(b)更新缓存中 key 值或更新缓存

(c)数据库

(d)删除缓存 key 或使缓存 key 失效或更新缓存(key 值)

【问题2】

​ 缓存系统一般以 key/value 形式存储数据,在系统运维中发现,部分针对缓存的查询,未在缓存系统中找到对应的 key,从而引发了大量对数据库服务器的查询请求,最严重时甚至导致了数据库服务器的宕机。

​ 经过运维人员的深入分析,发现存在两种情况:

(1)用户请求的 key 值在系统中不存在时,会查询数据库系统,加大了数据库服务器的压力;

(2)系统运行期间,发生了黑客工具,以大量系统不存在的随机 key 发起了查询请求,从而导致了数据库服务器的宕机。

​ 经过研究,研发团队决定,当在数据库中也未查找到该 key 时,在缓存系统中为 key 设置空值,防止对数据库服务器发起重复查询。

​ 请用 100 字以内文字说明该设置空值方案存在的问题,并给出解决思路。

答案:

存在问题:不在系统中的 key 值是无限的,如果均设置 key 值为空,会造成内存资源的极大浪费,引起性能急剧下降。

解决思路:查询缓存之前,对 key 值进行过滤,只允许系统中存在的 key 进行后续操作(例如采用 key 的 bitmap 进行过滤)。

【问题3】

​ 缓存系统中的 key 一般会存在有效期,超过有效期则 key 失效;有时也会根据 LRU 算法将某些 key 移除内存。当应用软件查询 key 时,如 key 失效或不在内存,会重新读取数据库,并更新缓存中的 key。

​ 运维团队发现在某些情况下,若大量的 key 设置了相同的失效时间,或者缓存系统重启等原因,都会造成数据库服务器请求瞬间爆量,引出大量缓存更新操作,导致整个系统性能极具下降,进而造成整个系统崩溃。

​ 请用 100 字以内文字,给出解决该问题的两种不同思路。

答案:

思路1:缓存失效后,通过加排他锁或者队列方式控制数据库写缓存的线程数量,使得缓存更新串行化;

思路2:给不同 key 设置随机或不同的失效时间,使失效时间的分布尽量均匀;

思路3:设置两级或多级缓存,避免访问数据库服务器。

整理完毕,完结撒花~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿放下技术的小赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值