数据库和缓存如何保证一致性?

当两个请求并发更新同一条数据的时候,会出现缓存和数据库不一致的现象

先更新数据库,再更新缓存,会出现数据不一致

先更新缓存,再更新数据库,也会出现数据不一致

先删除缓存,再更新数据库,也会出现数据不一致

先更新数据库,再删除缓存,也会出现数据不一致,但是可能性比较小。 但是由于每次更新数据的时候,缓存的数据都会被删除,这样对缓存命中率会有影响。

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

如果在第二步删除缓存失败了,那么会出现数据库和缓存不一致的情况,所以我们需要保证这两步操作都能执行成功,两种方法:

  • 重试机制,引入消息队列,多次删除
  • 订阅MySQLBinlog,再做操作缓存

业务对缓存命中率有很高

如果我们在业务对缓存命中率有很高的要求,我们可以使用更新数据库+更新缓存的方案,但是会遇到缓存不一致的问题,有两个办法解决:

  • 分布式锁,保证一个时间内只运行一个请求更新缓存
  • 更新完缓存后,给缓存加上一个较短的过期时间

如果是读写并发造成的不一致,可以使用延迟双删

你可能感兴趣的:(Redis,数据库,缓存)