mysql 的几种缓存,数据库缓存几种方式 -解道Jdon

数据库缓存的几种方式

引入缓存可以提高性能,但是数据会存在两份,一份在数据库中,一份在缓存中,如果更新其中任何一份会引起数据的不一致,数据的完整性被破坏了,因此,同步数据库和缓存的这两份数据就非常重要。本文介绍常见的缓存更新的同步策略。

预留缓存Cache-aside

应用代码能够手工管理数据库和缓存中数据,应用逻辑会在访问数据库之前检查缓存,在数据库更新以后再更新缓存:

cfac6403bb9e7cf79ea45ef1e1f5fbef.png

上图中Cache update缓存更新时,通过手工编码分别对数据库save(entity)和缓存(put(key,entity))做更新,将这种琐碎的缓存管理和更新夹杂在应用逻辑中并不是一种好方式,可以采取AOP面向方面拦截器等方式实现缓存操作,减轻缓存操作泄漏到应用代码中,同时确保数据库和缓存都能正确同步。

Read-through

相比上面同时管理数据库和缓存,我们可以简单委托数据库同步给一个缓存提供者,所有数据交互通过这个缓存抽象层完成。

cf9cfbea3d9b240930f736e33b01d071.png

图中CacheStore是我们的缓存抽象层,当我们应用通过其抓取一个缓存数据时,这个缓存提供者确认缓存中是否有该数据,如果没有,从数据库加载,然后放入缓存,下次以后再访问就可以直接从缓存中获得。

Write-through

类似于Read-through的数据抓取策略,缓存能够在其中数据变化时自动更新底层数据库。

34c9952b79838df5417894a0c57a0ef1.png

尽管数据库和缓存同步更新了,但是我们也可以按照我们自己的业务要求选择事务的边界:

如果需要强一致性,,并且缓存提供者提供了XAResource ,这样我们可以在一个全局事务中完成缓存和数据库的更新,这样数据库和缓存更新是在一个原子单元:single atomic unit-of-work

如果只需要弱一致性,我们可以先后更新缓存和数据库,不必使用全局事务,这会让我们提升快速响应性与性能,通常缓存首先被更新,如果数据库更新失败,缓存可以通过补偿动作实现回滚当前事务所做的改变。

Write-behind

如果强一致性不是必须的,我们可以简单将缓存的更新放在队列中,然后定期批量地去更新数据库。

039267712977c0e8a3a9051077fe6c33.png

这种策略虽然打破了事务保证,但是性能要远远超过write-through,因为数据库能够快速批量更新,事务机制不再需要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值