缓存与数据库双写一致性几种策略分析

科技资讯 投稿 7900 0 评论

缓存与数据库双写一致性几种策略分析

作者:京东零售 于泷

一、背景

为保证高并发性能,以下分析场景不考虑执行的原子性及加锁等强一致性要求的场景,仅追求最终一致性。

二、读取过程

• 如果缓存里没有值,那就读取数据库的值

三、更新过程

更新操作有多种策略,各有优劣,主要针对此场景进行分析

策略1:先更新db,再删除缓存(常用的Cache-Aside Pattern旁路缓存)

1.如果更新db成功,删缓存失败,将导致数据不一致

1此时缓存刚好失效 2)A查库得到旧值 3)B更新DB成功

此场景的发生需要步骤2)查db 始终慢于 3)的更新db,才能导致4)先于5)执行,通常db的查询是要快于写入的,所以此极端场景的产生过于严格,不易发生

策略2:先更新db,再更新缓存

1.并发更新场景下,更新缓存会导致数据不一致

此种方式不推荐

策略3:先更新缓存,再更新db

策略4:先删缓存,再更新db

例如:请求 A 删除缓存,这时请求B来查,就会击穿到数据库,B读取到旧的值后写入缓存,A正常更新db,由于时间差导致数据不一致的情况

策略5:缓存延时双删

策略6:变种双删,前置缓存过期时间

能够解决策略4中的问题:请求 A 删除缓存,这时请求B来查,就会击穿到数据库,B读取到旧的值后写入缓存,A正常更新db,由于时间差导致数据不一致的情况,描述图如下:

expire时间没有覆盖住更新db的耗时,类似策略1中极端场景,此处不赘述

四、总结

对于每种方案策略,各有利弊,但一致性问题始终存在(文章开头排除了原子性和锁),只是发生的几率在一点点慢慢变小了,方案的评估不仅要根据自身系统的业务场景,如读写比、并发量、一致性容忍度,还要考虑系统复杂度,投入产出比等,寻找最合适的方案。

编程笔记 » 缓存与数据库双写一致性几种策略分析

赞同 (45) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽