读操作
- 尝试从缓存get数据,结果没有命中。
- 从数据库获取数据,读从库。
- 把数据set到缓存,未来能够命中缓存。
写操作
- delete缓存。
- 操作数据库。
为什么写操作先操作缓存,再操作数据库?
- 如果操作数据库成功,但是操作缓存失败,会导致数据库与缓存的不一致。
写操作为什么不更新缓存,而是删除?
- 使用更新,1成功,2失败,会导致缓存里是更新后的数据,数据库里是之前的数据,数据不一致。
- 使用删除,1成功,2失败,会导致缓存里没有数据,数据库里是之前的数据,数据没有不一致。只是下一次读取,会多一次cache miss。
写操作完成后,数据库主从同步未完成(主库是新数据,从库是旧数据),此时读操作将旧数据写入缓存,怎么办?
- 方案一
- 通过工具(canal)订阅从库的binlog,从库执行完写操作后,再次删除缓存,淘汰可能写入缓存的旧数据。
- 方案二
- 写操作后,将哪个库,哪个表,哪个主键三个信息拼装一个key写到cache里,这条记录的超时时间,设置为“主从同步所需时间”。
- 读操作第二步改为拼装key去缓存中查找,如果命中则强制读主库,否则读从库。
本文作者: 飞光
本文链接: https://zhucj94.github.io/article/9e1a046e.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!

本文链接: https://zhucj94.github.io/article/9e1a046e.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
