该模式是最常用的设计模式,具体逻辑如下
失效:应用程序先从Cache取数据,如果没有得到,则从数据库中取数据,成功后,放到缓存中[在它品的代码中随处可见]
命中:应用程序先从Cache中取数据,取到后返回
更新:先把数据存到数据库中,成功后,再让缓存失效
进程1(读) | 进程2(写) |
---|---|
读操作 | |
没有命中缓存 | |
数据库中取数据 | 同时一个写操作 |
写完成 | |
失效缓存 | |
将老数据放入缓存(造成脏数据) |
不过该场景发生的概率非常低,需要读缓存失效的同时有并发写操作。但对数据库来说写比读慢很多,而且还要锁表,读操作必须在写操作进入数据库之前,还要晚于写操作更新缓存。
流程如下图
在Cache Aside模式中,应用代码需要维护两个数据存储,一个是缓存,一个是数据库。
在Read/Write Through模式中,由缓存处理更新数据库的操作。这种模式对应用层来说更简单(认为后端就是一个单一的存储,而存储维护自己的Cache)
Write Behind 又叫 Write Back。改模式在更新数据的时候,只更新缓存,不更新数据库,然后异步的批量更新数据库。该设计的好处是让I/O操作很快(直接操作内存)。因为异步,Write Back还可以合并对同一个数据的多次操作。
该模式带来的问题是,数据不是强一致性的,而且可能会丢失。
同时该处理逻辑比较复杂,需要追踪有哪些数据被更新,需要刷到持久层。
流程如下图
参考:
time.geekbang
FaceBook论文
Quora上关于为什么不是写数据库的时候更新缓存的问答
原文:https://www.cnblogs.com/biby/p/14829609.html