目录
- 概述
- 缓存策略的选择
- Cache Aside
- Read Through
- Write Through
- Write-Behind
- 小结
概述
在系统架构中,缓存可谓提供系统性能的最简单方法之一,稍微有点开发经验的同学必然会与缓存打过交道,最起码也实践过。
如果使用得当,缓存可以减少响应时间、减少数据库负载以及节省成本。但如果缓存使用不当,则可能出现一些莫名其妙的问题。
在不同的场景下,所使用的缓存策略也是有变化的。如果在你的印象和经验中,缓存还只是简单的查询、更新操作,那么这篇文章真的值得你学习一下。
在这里,为大家系统地讲解4种缓存模式以及它们的使用场景、流程以及优缺点。
缓存策略的选择
本质上来讲,缓存策略取决于数据和数据访问模式。换句话说,数据是如何写和读的。
例如:
- 系统是写多读少的吗?(例如,基于时间的日志)
- 数据是否是只写入一次并被读取多次?(例如,用户配置文件)
- 返回的数据总是唯一的吗?(例如,搜索查询)
选择正确的缓存策略才是提高性能的关键。
常用的缓存策略有以下五种:
- Cache-Aside Pattern:旁路缓存模式
- Read Through Cache Pattern:读穿透模式
- Write Through Cache Pattern:写穿透模式
- Write Behind Pattern:又叫Write Back,异步缓存写入模式
上述缓存策略的划分是基于对数据的读写流程来区分的,有的缓存策略下是应用程序仅和缓存交互,有的缓存策略下应用程序同时与缓存和数据库进行交互。因为这个是策略划分比较重要的一个维度,所以在后续流程学习时大家需要特别留意一下。
Cache Aside
Cache Aside是最常见的缓存模式,应用程序可直接与缓存和数据库对话。Cache Aside可用来读操作和写操作。
读操作的流程图:
读操作的流程:
- 应用程序接收到数据查询(读)请求;
- 应用程序所需查询的数据是否在缓存上:
- 如果存在(Cache hit),从缓存上查询出数据,直接返回;
- 如果不存在(Cache miss),则从数据库中检索数据,并存入缓存中,返回结果数据;
这里我们需要留意一个操作的边界,也就是数据库和缓存的操作均由应用程序直接进行操作。
写操作的流程图:
这里的写操作,包括创建、更新和删除。在写操作的时候,Cache Aside模式是先更新数据库(增、删、改),然后直接删除缓存。
Cache Aside模式可以说适用于大多数的场景,通常为了应对不同类型的数据,还可以有两种策略来加载缓存:
- 使用时加载缓存:当需要使用缓存数据时,从数据库中查询出来,第一次查询之后,后续请求从缓存中获得数据;
- 预加载缓存:在项目启动时或启动后通过程序预加载缓存信息,比如”国家信息、货币信息、用户信息,新闻信息“等不是经常变更的数据。
Cache Aside适用于读多写少的FDmIrB场景,比如用户信息、新闻报道等,一旦写入缓存,几乎不会进行修改。该模式的缺点编程客栈是可能会出现缓存和数据库双写不一致的情况。
Cache Aside也是一个标准的模式,像Facebook便是采用的这种模式。
Read Through
Read-Through和Cache-Aside很相似,不同点在于程序不需要关注从哪里读取数据(缓存还是数据库),它只需要从缓存中读数据。而缓存中的数据从哪里来是由缓存决定的。
Cache Aside是由调用方负责把数据加载入缓存,而Read Through则用缓存服务自己来加载,从而对应用方是透明的。Read-Through的优势是让程序代码变得更简洁。
这里就涉及到我们上面所说的应用程序操作边界问题了,直接来看流程图:Redis的4种缓存模式分享
扫一扫手机访问
