缓存与数据库不一致

数据库集群架构

一主多从,主从同步,读从写主。

数据库主从不一致

写后立刻读 写主读从,主动同步完成之前,会读取到旧数据

解决问题

  • 允许短时间不一致 忽略
  • 强制读主库 使用缓存 读和写都落到主库
  • 选择性读主 写主 哪个库,哪个表,哪个主键三个信息拼装一个key设置到cache,超时时间,设置为“主从同步时延” 读请求: 到cache里去查询 有key 读主 无key 读从

读操作 缓存不命中

命中 读cache

尝试从缓存get数据,结果没有命中 从数据库获取数据,读从库,读写分离 把数据set到缓存,未来能够命中缓存

写操作

  • del 缓存 not set 并发写时序问题 数据库与缓存之间的数据不一致
  • cache first or db first 准则:数据最终以数据库为准,写缓存成功,其实并不算成功 db first if cache failed => 数据不一致 so cache first if db failed => 不影响业务

缓存与数据库不一致

主从不一致 导致因为读操作弄脏缓存

从库同步完成之后,如果有旧数据入缓存,应该及时把这个旧数据淘汰掉

从库执行完写操作,向缓存再次发起删除,淘汰这段时间内可能写入缓存的旧数据

订阅从库的binlog,这里能够最准确的知道,从库数据同步完成的时间