跳至主要內容

缓存和数据库如何保持一致

逸尘.Lycodx大约 2 分钟面试题cachedb

缓存和数据库如何保持一致

背景

项目中同时使用数据库和缓存时,当请求过多,读写频繁时,更新数据库就有可能导致缓存与数据库不一致的情况发生。

思考

应该如何操作才能保证缓存和数据库保持一致性呢?

更新方式

逐个分析每一种情况

1、先更新数据库,再更新缓存

如果数据库更新成功,缓存失败,那么我们在缓存失效之前,读取到的一直都是老数据,而数据库里早已更新成新数据。

2、先更新缓存,再更新数据库

如果缓存更新成功,而数据库更新失败,导致我们读取到的值一直都是错误的缓存值。

总结

这两种方案都很难保证操作的原子性,除此之外在并发编程中不管是先更新哪一个,并且不出现失败的情况也是会出现不一致的请求,所以不推荐使用

删除方式 (旁路缓存策略[Cache Aside])

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

如上图所示:这种方案业可能导致数据库与缓存不一致的情况。

结论

如果非要使用该方法,我们一般使用延迟双删的方法,就是A请求先删除缓存,B请求未命中,查询数据库更新缓存,A请求再更新数据库,然后再隔500毫秒删除缓存。这样下一次请求就会更新到最新的数据了。(这种做法就是不好控制延迟时间)

4、先更新数据库,再删除缓存(推荐)

当我们更新完数据库,立马删除缓存,下一个请求进来就会未命中缓存,从而到数据库中查询,然后再更新到缓存中,这样就能保证一致性了。

结论

这种方案唯一要保证的点就是删除数据一定要成功,可以把删除失败的任务放入消息队列中,进行再次删除。还可以使用MySQL的cancal监听binlog(没有使用过,也是道听途说)

上次编辑于: