双写一致性要求:
缓存不能读到脏数据
缓存可能会读到过期数据,但要在可容忍时间内实现最终一致
这个可容忍时间尽可能的小
一.先更新数据库,再更新缓存
线程A更新数据库,线程A更新缓存
线程B更新数据库,线程B更新缓存
因为网络等原因,线程A更新缓存晚于线程B更新缓存,导致缓存与数据库不一致
延时双删
二.先删除缓存,再更新数据库
线程A删除缓存,线程A更新数据库;
线程B查询缓存不存在,更新缓存
线程A更新数据库晚于线程B更新缓存,导致缓存与数据库不一致
三.先更新数据库,再删除缓存
缓存失效,线程A查询数据库,设置缓存
线程B更新数据库,删除缓存
线程A在线程B更新缓存后将之前查询的数据库旧值设置到缓存
最终一致性:
使用canal监听订阅的binlog,发送消息到业务系统实现更新缓存。