5种服务端缓存设计模式
Cache Aside Pattern
Cache Aside Pattern是最经典的缓存 + 数据库读写的模式。
- 读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应
- 更新的时候,先更新缓存,然后再更新数据库(缓存和数据库双写)
最大的缺点就是需要应用程序侧来编排读写流程。
读取的步骤
- 先从缓存中读取数据;
- 如果缓存数据不存在,那么从数据库中读取数据;
- 写入缓存。
写入的步骤
- 先处理缓存;
- 再操作数据库。
可能存在的问题
- 其中一个步骤成功,一个步骤失败。
- 写操作刚完成,另外一个读操作就进来了。
Read-Through Pattern
读取的责任全部都丢给了缓存提供者,将责任做了一个分离。应用程序只需要和缓存提供者打交道,至于背后如何同数据库交互,完全不需要管。
Write-Through Pattern
写入的的责任全部都丢给了缓存提供者,将责任做了一个分离。应用程序只需要和缓存提供者打交道,至于背后如何同数据库交互,完全不需要管。
Write-Behind Pattern
它与Write-Through极其相似,唯一差异就是最后一步,它是通过异步方式向数据库写入数据。
Refresh-Ahead Pattern
简单来说,就是在热点缓存数据即将失效的时候,数据库的数据发生改变的时候,主动刷新缓存中的数据。它能够使得热数据的缓存数据一直保持在缓存,并且都是最新的数据。
它还可以有效的规避惊群效应——试想一下,如果所有数据都是同一时间失效,那么将会对缓存和数据库造成多大的压力。
参考资料
- Cache Aside Pattern(缓存模式)解析
- Cache Aside Pattern 缓存+数据库读写模式的分析
- Cache-Aside pattern
- Cache Aside Pattern简单理解
- Consistency between Cache and Database, Part 1
- Cache-Aside pattern
- A Hitchhiker’s Guide to Caching Patterns
- Cache-Aside pattern. A how-to guide with .NET 8 and Redis
- Refresh Ahead Caching Pattern
- 6 Caching Strategies For System Design Interviews