更新缓存的的Design Pattern有四种:Cache aside, Read through, Write through, Write behind caching数据库
这是最经常使用最经常使用的pattern了。其具体逻辑以下:后端
失效:应用程序先从cache取数据,没有获得,则从数据库中取数据,成功后,放到缓存中。缓存
命中:应用程序从cache中取数据,取到后返回。并发
更新:先把数据存到数据库中,成功后,再让缓存失效。异步
失效和命中的示意图:ide
更新的示意图:性能
一个事实是,写操做(更新操做)要比读操做慢。spa
假设如今有两个并发操做读操做Read和更新操做Write,若是更新操做前就让缓存失效。那么Write还没进行完,就有Read操做进来,这时Read先从缓存获取数据而且没有获取到,那么Read会直接把老数据OldData读取出来后放到缓存中。然后Write更新了数据,数据变成了新的数据NewData。这时,就出现了缓存中的数据OldData和数据源中的数据NewData不一致的情形。而且Read操做一直能够从缓存中获取OldData,也无法对OldData进行更新了。操作系统
更新数据库(Repository)的操做由缓存本身代理。应用认为后端就是一个单一的存储,而存储本身维护本身的Cache。设计
Read Through 套路就是在查询操做中更新缓存,也就是说,当缓存失效的时候(过时或LRU换出),Cache Aside是由调用方负责把数据加载入缓存,而Read Through则用缓存服务本身来加载,从而对应用方是透明的。
Write Through 套路和Read Through相仿,不过是在更新数据时发生。当有数据更新的时候,若是没有命中缓存,直接更新数据库,而后返回。若是命中了缓存,则更新缓存,而后再由Cache本身更新数据库(这是一个同步操做)
下图自来Wikipedia的Cache词条。其中的Memory能够理解为就是例子里的数据库。
Write Behind 又叫 Write Back,更新数据的时候,只更新缓存,不更新数据库,而缓存会异步地批量更新数据库。
设计的好处就是让数据的I/O操做飞 快无比(由于直接操做内存 ),由于异步,write backg还能够合并对同一个数据的屡次操做,因此性能的提升是至关可观的。
带来的问题是,数据不是强一致性的,并且可能会丢失。
另外,Write Back实现逻辑比较复杂,由于他须要track有哪数据是被更新了的,须要刷到持久层上。操做系统的write back会在仅当这个cache须要失效的时候,才会被真正持久起来,好比,内存不够了,或是进程退出了等状况,这又叫lazy write。