概要
前文讲过MySQL的缓冲池buffer-pool,我们知道缓冲池是用于加速数据访问速度的。那么当发生写操作时,也需要更新缓冲池中缓存的数据,这也是在任何缓存架构体系下需要实现的机制。
简单的更新缓存套路:
1、持久化数据
2、让缓存失效
- 以上操作没有考虑缓存(Cache)和持久层(Repository)的整体事务的问题。
- 如果你需要强一致性,你需要使用“两阶段提交协议”——prepare, commit/rollback,比如Java 7 的XAResource,还有MySQL 5.7的 XA Transaction,有些cache也支持XA,比如EhCache。
当然,XA这样的强一致性的玩法会导致性能下降。
回到mysql中的实现:
缓存命中
1、先修改缓冲池中的页(内存)
2、顺序写入redo log (磁盘)
- 当读取时,会命中缓冲池中的页,直接返回缓存数据
- 当缓冲池数据通过LRU算法被淘汰时,“脏页”会被刷回磁盘
- 当数据库崩溃(内存丢失),从redo log中恢复数据
内存页与磁盘数据不一致时,内存页也叫做“脏页”,mysql采用定期刷盘,降低磁盘IO,提升mysql性能。
缓存不命中
1、先从磁盘加载数据到缓冲池(磁盘io)