2 Read/Write Through Pattern
上面的Cache Aside,应用代码需要维护两个数据存储,一个是缓存,一个是数据库,应用程序比较啰嗦。
而Read/Write Through是把更新数据库的操作由缓存自己代理,所以,对于应用层来说,就简单很多。
可理解为,应用认为后端就是一个单一的存储,而存储自己维护自己的Cache。
2.1 Read Through
Read Through 就是在查询操作中更新缓存,也就是说,当缓存失效的时候(过期或LRU换出)
- Cache Aside是由
调用方负责
把数据加载入缓存 - Read Through则用
缓存服务
自己来加载,从而对应用方是透明的
2.2 Write Through
和Read Through相仿,不过是在更新数据时发生
当有数据更新时
- 如果没有命中缓存,直接更新数据库,然后返回
- 如果命中了缓存,则更新缓存,然后再由Cache自己更新数据库(这是一个同步操作)
下图中的Memory可以理解为就是我们例子里的数据库
3 Write Behind(异步写回)
又叫 Write Back。在更新数据时,只更新缓存,不更新DB,而我们的缓存会异步批量更新DB
优点
- 让数据的I/O操作飞快无比(因为直接操作内存嘛 )
- 因为异步,write back还可以合并对同一个数据的多次操作,所以性能的提高是相当可观
缺点
数据不是强一致性的,而且可能会丢失(我们知道Unix/Linux非正常关机会导致数据丢失,就是因为这个事)。
另外,Write Back实现逻辑比较复杂,因为他需要track哪些数据是被更新的,需要刷到持久层。
os的write back会在仅当这个cache需要失效时,才会被真正持久化,比如,内存不够了,或是进程退出了等情况,这又叫lazy write。
比如在向磁盘中写数据时采用的也是这种策略。无论是:
- os层面的 Page Cache
- 日志的异步刷盘
- 消息队列中消息的异步写入磁盘
大多采用了这种策略。因为这个策略在性能优势明显,直接写内存,避免了直接写磁盘造成的随机写。
A write-back cache with write allocation