通常在高性能要求的场景,我们的系统设计会把数据存储到DB,然后冗余一份数据在缓存中。读请求优先从缓存读取数据,未命中缓存再从DB读取,如下图:
![80568ade8c6979e433ecb6a4a969a3c6.png](https://img-blog.csdnimg.cn/img_convert/80568ade8c6979e433ecb6a4a969a3c6.png)
欢迎关注笔者,优质文章都在这里等你。
这样做的好处是可以减小DB的压力,提高请求的响应速度。
但这种架构在提升系统读请求处理能力的同时,给系统写请求的处理带来了不少的麻烦。因为数据在DB跟缓存中各自保存了一份,如何保证它们之间的数据一致就是本文要讨论的问题。
当处理写请求时有两种方式:
一、先写缓存再写DB
如果第一步写缓存失败,直接返回,无影响。
如果缓存写成功,DB写失败,此时如果不清除缓存中已写入的数据,则会造成数据不一致(缓存中是新值,DB中是旧值)。
如果增加清除缓存的逻辑,那么清除操作又失败了该如何处理?
二、先写DB再写缓存
如果DB写入失败,直接返回,无影响。
如果DB写入成功,缓存写入失败则会造成数据不一致(即DB中是新值,缓存中是旧值)。
如果重试写入缓存,那重试也失败该如何处理?