缓存读写策略
- Cache Aside Pattern(旁路缓存模式)
- 概述
- 流程
- 缺点
- Read/Write Through Pattern(读写穿透)
- 概述
- 与缓存旁路策略的不同
- 流程
- 缺点
- Write Behind Pattern(异步缓存写入)
- 概述
Cache Aside Pattern(旁路缓存模式)
概述
这是我们平时使用比较多的一个缓存读写模式,适合读请求比较多的场景。
流程
写:先更新数据库,然后删除缓存的数据
读:先从cache中读取数据,存在的话直接返回。 不存在的话,从数据库读取数据,再将数据更新到缓存中
缺点
- 首次请求数据一定不在 cache 的问题
- 解决办法:可以将热点数据可以提前放入cache 中
- 写操作比较频繁的话导致cache中的数据会被频繁被删除,这样会影响缓存命中率
- 解决办法:可以在更新DB的时候同样更新cache
Read/Write Through Pattern(读写穿透)
概述
该策略中,服务端把 cache 视为主要数据存储,从中读取数据并将数据写入其中。cache 服务负责将此数据读取和写入 DB,从而减轻了应用程序的职责。
与缓存旁路策略的不同
在 缓存旁路模式 下,发生读请求的时候,如果 cache 中不存在对应的数据,是由客户端自己负责把数据写入 cache,
而 读写穿透模式 则是 cache 服务自己来写入缓存的,这对客户端是透明的。
流程
写:先查 cache,cache 中不存在,直接更新 DB
读:cache 中存在,则先更新 cache,然后 cache 服务自己更新 DB(同步更新 cache 和 DB)
缺点
- 首次请求数据一定不在 cache 的问题
- 解决办法:可以将热点数据可以提前放入cache 中
Write Behind Pattern(异步缓存写入)
概述
该策略,是同步更新 cache 和 数据库,而 Write Behind Caching 则是只更新缓存,不直接更新 数据库,而是改为异步批量的方式来更新 数据库。这种方式对数据一致性带来了更大的挑战,比如cache数据可能还没异步更新DB的话,cache服务可能就就挂掉了。
这种策略在我们平时开发过程中也非常非常少见,但是不代表它的应用场景少,比如消息队列中消息的异步写入磁盘、MySQL 的 InnoDB Buffer Pool 机制都用到了这种策略。Write Behind Pattern 下 数据库的写性能非常高,非常适合一些数据经常变化又对数据一致性要求没那么高的场景,比如浏览量、点赞量。