让数据库和缓存数据保持一致的三种策略( 二 )


但是,其带来的问题是,数据不是强一致性的,而且可能会丢失(我们知道Unix/linux非正常关机会导致数据丢失,类似这种情况) 。
另外,Write Back实现逻辑比较复杂,因为他需要track有哪些数据是被更新了的,需要刷到持久层上 。操作系统的write back会在仅当这个cache需要失效的时候,才会被真正持久起来,比如,内存不够了 , 或是进程退出了等情况,这又叫lazy write 。
四、总结对于这个老生常谈的问题,分析起来其实并不简单 。
额外分享几点自己心得给你:
1、性能和一致性不能同时满足,为了性能考虑,通常会采用「最终一致性」的方案;
2、掌握缓存和数据库一致性问题,核心问题有 3 点:缓存利用率、并发、缓存 + 数据库一起成功问题;
3、失败场景下要保证一致性,常见手段就是「重试」,同步重试会影响吞吐量,所以通常会采用异步重试的方案;
4、订阅变更日志的思想,本质是把权威数据源(例如 MySQL)当做 leader 副本,让其它异质系统(例如 redis / Elasticsearch)成为它的 follower 副本,通过同步变更日志的方式,保证 leader 和 follower 之间保持一致 。
面讲到的几种缓存更新的设计方式,都是前人总结出来的经验,这些方式或多或少都有一些弊端 , 并不完美,实际上也很难有完美的设计 。大家在做系统设计的时候 , 也不要去追求完美,要有一些取舍,找到一种最适合自己业务场景的方式就行 。
【让数据库和缓存数据保持一致的三种策略】

让数据库和缓存数据保持一致的三种策略

文章插图
图片
 




推荐阅读