缓存和数据库双写不一致
数据查询
先查询缓存,命中即返回,未命中则查询数据库,然后更新缓存数据。
数据更新
两个大方案,Cache Aside Pattern 和 缓存延时双删
Cache Aside Pattern
先删除缓存再更新数据
可以避免缓存删除失败后,缓存和数据库数据不一致的问题。
问题:当删除缓存后,数据还未更新成功的时间窗口内,如果发生数据查询,则缓存内的数据都为老数据。
先更新数据再删除缓存
facebook 就是这种方式,可以避免更新数据的时间窗口内,数据查询不是最新数据的问题。
问题:当删除缓存失败时,缓存内的数据将在下一次数据更新前都是老数据。
缓存延时双删
更新数据库后删除缓存,然后隔一段时间异步再次删除缓存。
可以通过消息队列订阅 MySql 的 binlog 日志(现成的中间件 canal),也可以通过程序启动异步线程去执行删除。
问题:当缓存删除失败后,会出现短时间的不一致,不一致的时间窗口为延时删除的延迟时间。
Simple is Awesome