Java进阶之路饥人谷技术博客Java

面试题 | 缓存数据不一致

2021-08-07  本文已影响0人  java搬砖从来不加班

数据一致性问题是分布式架构设计中经常需要考虑的问题,也是面试经常会被提问的一个问题。系统某个业务的数据,可能会同时存在在DB和缓存中,那就有可能会发生DB和缓存的数据一致的情况。如果缓存有多个副本,那么多个缓存副本里的数据也会出现不一致的情况。

业务场景

某商品平台,显示某阶段的商品销量排行榜,第一次加载时从DB中加载,并缓存到数据库中。当再次读取该排行榜时,直接从缓存中读取。

当商品排行变更时,其先会写入到DB中,更新后也更新到缓存中,但其实缓存可能发生更新失败。

原因分析

数据不一致大多数是跟缓存更新异常有关系。

更新DB后,写缓存失败,导致缓存中存的是老数据

多个缓存副本时,更新某个副本失败,也导致这个副本的缓存数据是老数据

解决方案

方案一:增加更新缓存重试机制

缓存更新失败后,可以进行重试,如果重试失败,则将失败的key写入队列服务,待缓存访问恢复后,将key从缓存中删除。这些key在再次被查询时,重新从DB中加载,从而保证数据一致性。

方案二:减小缓存时间

减小缓存时间,主要为了让缓存数据及早过期,然后再次访问时从DB中重新加载,确保数据的最终一致性。(该前提,建议场景是在非核心业务上或非高峰大请求读的场景下,避免高峰时大量请求时,缓存过期,导致缓存雪崩的场景)

以上,方案是更新DB时,再更新缓存,那如果先删除缓存,再修改数据库,如果删除缓存成功了修改数据库失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致,因为读的时候缓存没有,则读数据库中旧数据,然后更新到缓存中。

上一篇下一篇

猜你喜欢

热点阅读