1. 9IM首页
  2. 热点

解决缓存与数据库的数据一致性问题

首先需要明白会导致缓存与数据库的数据不一致的几个诱因: 多个写请求的执行顺序不同导致脏数据。 更新时正好有读请求,读请求取到旧数据然后更新上。或者数据库是读写分离的,在主库更新完之后,需要一定的时间,从库才能更新。

1.先更新数据库,后更新缓存

1.两个写请求,写请求A,写请求B,A先更新数据库,B后更新数据库,但是可能B会先更新缓存,A后更新缓存,这样就会导致缓存里面的是旧数据。 2.更新缓存时失败也有可能导致缓存是旧数据。

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

1.删除缓存后,更新数据库之前假如正好有读请求,读请求把旧数据设置到缓存了。

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

1.更新后删除缓存时,网络不好,删除失败也有可能导致缓存是旧数据。

正确的方案

1.写请求串行化

将写请求更新之前先获取分布式锁,获得之后才能更新,这样实现写请求的串行化,但是会导致效率变低。

2.先更新数据库,异步删除缓存,删除失败后重试

先更新数据库,异步删除缓存,删除缓存失败时,继续异步重试,或者将操作放到消息队列中,再进行删除操作。(如果数据库是读写分离的,那么删除缓存时需要延迟删除,否则可能会在删除缓存时,从库还没有收到更新后的数据,其他读请求就去从库读到旧数据然后设置到缓存中。)

3.业务项目更新数据库,其他项目订阅binlog更新

业务项目直接更新数据库,然后其他项目订略binlog,接收到更新数据库操作的消息后,更新缓存,更新缓存失败时,新建异步线程去重试或者将操作发到消息队列,然后后续进行处理。但是这种方案更新mysql后还是有一定延迟,缓冲中才是新值。

原创文章,作者:9IM,如若转载,请注明出处:https://www.9im.cn/619.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注