缓存与数据库的一致性保证

610 阅读2分钟

数据一致性分类

image.png

缓存模式

1:cache aside

image.png

image.png

写请求的四种机制对比

重点问题:旁路缓存模型写请求发生时为何选用先更新数据库再删除缓存机制?

写请求共有四种机制可选,如下

机制一:先更新缓存,再更新数据库

image.png

线程A更新20,线程B更新10

1:线程A更新缓存

2:线程B更新缓存

3:线程B更新数据库

4:线程A更新数据库

影响:造成数据不一致(db为20,cache为10)

机制二:先更新数据库,再更新缓存

image.png

线程A更新20,线程B更新10

1:线程A更新数据库

2:线程B更新数据库

3:线程B更新缓存

4:线程A更新缓存

影响:造成数据不一致(db为10,cache为20)

机制三:先删除缓存,再更新数据库

image.png

线程A更新20,旧数据是10

1:线程A删除缓存

2:线程B无命中缓存

3:线程B查询数据库

4:线程B更新缓存

5:线程A更新数据库

影响:造成数据不一致(db为20,cache为10)

机制四:先更新数据库,再删除缓存(cache aside写机制)

image.png

线程A更新20, 旧数据是10

1:线程B未命中缓存

2:线程B查询数据库

3:线程A更新数据库

4:线程A删除缓存

5:线程B更新缓存 影响:造成数据不一致(db为20,cache为10),但是这种机制在四种机制里发生的情况最低(猜的)

猜想:先更新数据库,再延时删除缓存(借助消息队列异步延时删除缓存),意味着数据不一致只发生在延时时间段。

达到最终一致性的2个方法

方法一:缓存设置过期时间

业务允许少量数据某段时间内数据不一致

方法二:缓存延时双删

image.png

删除缓存失败,引入删除重试机制

方法一:借助消息队列,业务代码入侵

原理:将删除失败的key放入消息队列中,再消费消息,重试删除缓存操作

image.png

缺点:造成许多业务代码入侵

方法二:借助binlog机制

原理:扫描binlog日志,通过ACK机制确认是否删除缓存

image.png

2:Read-Through/Write-Through

Read-Through读请求

image.png 多了个Cache Provider,让应用程序代码简洁 Write-Through写请求

image.png 注意:更新缓存和更新数据库是同步

3:Write behind(异步缓存写入)

image.png

先更新缓存,再批量异步地更新数据库

优缺点:性能高,适用于频繁写的业务,但不适用于一致性要求高的业务