Cache aside
旁路缓存,旁路缓存操作逻辑是查询缓存,如果不存在那么就读取数据库并更新到缓存当中.
如果是更新数据库,那么操作完数据库后,删除缓存.
注意旁路缓存,缓存中的内容是不做更新操作的,只有写入和删除操作.
问题
1.请求1查询不到缓存,查询数据库.请求2更新数据,删除缓存,请求1写入缓存.这时缓存当中的数据就是旧的数据.
解决方法:
给缓存的数据加一个过期的时间,尽可能减少过期缓存发生的概率.缓存的过期时间也不宜过短,过短导致缓存的作用减少.
2.更新频繁的场景下会导致缓存频繁的被删除,降低了缓存的作用
解决方法:
使用Write through,可以减少这种情况的发生.
适用场景
用于读操作较多.实现简单.
Read/Write through
核心策略:以缓存为操作为主,数据存先存在于缓存,缓存的数据是不会过期的.
Read Through:先查询缓存中数据是否存在,如果存在则直接返回,如果不存在,则由缓存组件负责从数据库中同步加载数据.
Write Through:先查询要写入的数据在缓存中是否已经存在,如果已经存在,则更新缓存中的数据,并且由缓存组件同步更新到数据库中,,果缓存中数据不存在,我们把这种情况叫做Write Miss(写失效),图中以Write allocate方式.
Write Miss解决方式:一个是“Write Allocate(按写分配)”,做法是写入缓存相应位置,再由缓存组件同步更新到数据库中,图中就是指的是这种方式;另一个是“No- write allocate(不按写分配)”,做法是不写入缓存中,而是直接更新到数据库中.
适用场景
用于读操作较多.相较于Cache aside而言更适合缓存一致的场景.
使用简单屏蔽了底层数据库的操作,只是操作缓存.
这种方式其实可以以Redis为存储,对数据的持久性要求较低的.
Write Back(Write behind)
Write back是相较于Write Through而言的一种异步回写策略.
异步写可以减少与物理磁盘存储的交互,也可以进行合并写等优化.
问题
实现比较复杂,可能会丢失数据.
适用场景
用于读少写多的场景,Linux系统的页缓存和MySQL InnoDB 引擎的Cache Pool其实就是使用的WriteBack策略.
相较于Write through 而言拥有更高的写入性能.
总结
不管是哪种缓存策略都无法保证数据库与缓存的一致性.因此业务层要对缓存的数据有一定的容忍,缓存中的数据可能是过期的或者是无效的数据.