page contents

双写一致性方案一:先删除缓存,后更新数据库

轩辕小不懂 发布于 2021-11-24 14:24
阅读 22
收藏 0
分类:数据库
2488
Nen
Nen
- 程序员

该方案也会出问题,此时来了两个请求,请求 A(更新操作) 和请求 B(查询操作)

1. 请求A进行写操作,删除缓存

2. 请求B查询发现缓存不存在

3. 请求B去数据库查询得到旧值

4. 请求B将旧值写入缓存

5. 请求A将新值写入数据库。

上述情况就会导致不一致的情形出现。而且,如果不采用给缓存设置过期时间策略,该数据永远都是脏数据

答案一:延时双删

最简单的解决办法延时双删

使用伪代码如下:

public void write(String key,Object data){
 Redis.delKey(key);
 db.updateData(data);
 Thread.sleep(1000);
 Redis.delKey(key);
 }
转化为中文描述就是
(1)先淘汰缓存
(2)再写数据库(这两步和原来一样)
(3)休眠1秒,再次淘汰缓存,这么做,可以将1秒内所造成的缓存脏数据,再次删除。确保读请求结束,写请求可以删除读请求造成的缓存脏数
据。自行评估自己的项目的读数据业务逻辑的耗时,写数据的休眠时间则在读数据业务逻辑的耗时基础上,加几百ms即可。
如果使用的是 Mysql 的读写分离的架构的话,那么其实主从同步之间也会有时间差。
请先 登录 后评论