怎么保证缓存和数据库数据的一致性

  • Post author:
  • Post category:其他


  1. 做数据查询时,缓存不存在的情况下,选择

    淘汰缓存还是更新缓存

    ?

对应简单数据,两者都可以。对应复杂数据,一般选择淘汰缓存。

  1. 做数据更新(新增或者修改)时,选择先淘汰缓存,再更新数据库

原因:假如先更新数据库,再淘汰缓存,假如缓存淘汰失败,那么后面的请求都会得到脏数据,直至缓存过期。假如先淘汰缓存再更新数据库,如果数据库更新失败,只会产生一次缓存miss,相比较而言,后者对业务影响更小一点。

  1. 延时双删策略

    3.1 如下场景:同时有一个请求A进行更新操作,另一个请求B进行查询操作。

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

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

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

    (4)请求B将旧值写入缓存

    (5)请求A将新值写入数据库

    次数便出现了数据不一致问题。采用延时双删策略得以解决
public void update(String key,Object data){
    redisUtils.del(key);
    db.update(data);
    Thread.Sleep(100);
    redisUtils.del(key);
}

这么做,可以将1秒内所造成的缓存脏数据,再次删除。这个时间设定可根据俄业务场景进行一个调节。

3.2 数据库读写分离的场景

两个请求,一个请求A进行更新操作,另一个请求B进行查询操作。

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

(2)请求A将数据写入数据库了,

(3)请求B查询缓存发现,缓存没有值

(4)请求B去从库查询,这时,还没有完成主从同步,因此查询到的是旧值

(5)请求B将旧值写入缓存

(6)数据库完成主从同步,从库变为新值

依旧采用延时双删策略解决此问题



版权声明:本文为yyqhwr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。