redis与mysql双写数据不一致问题

三种更新策略:

先更新数据库,再更新缓存(线程不安全)

1、线程A更新了数据库;

2、线程B更新了数据库;

3、线程B更新了缓存;

4、线程A更新了缓存;

数据库是B写入的值,而缓存中是A写入的旧值

  写多读少的场景,频繁写缓存很浪费性能;


先删缓存,再更新数据库(线程不安全)

1、线程A删除了缓存;

2、线程B查询缓存发现不存在;

3、线程B更新了缓存;

4、线程A写入了数据库;

数据库是A写入的值,而缓存中是B写入的旧值

可以使用延时双删策略进行优化;

延时双删:

  1. 先删除缓存;
  2. 再写入数据库;
  3. 异步发消息,再去删除一次缓存;

先更新数据库,再删除缓存

这种方案最好,但是有极低的概率会发生不一致的情况;

1、缓存刚好失效;

2、线程A去数据库读取数据;

3、线程B写入数据库;

4、线程B删除缓存;

5、线程A写入缓存;

数据库中是B写入的新值,而缓存中是A写入的旧值

PS:这种情况发生的概率极低,因为读取数据库到写入缓存所花费的时间应该远远低于B操作的时间,如果真的发生了,用发消息来删除的方案也可以解决;

你可能感兴趣的:(Redis,MYSQL,面试系列,数据库,mysql,redis)