一、旁路缓存模式
比较适合读请求比较多的场景
写 :
- 先更新 DB
- 然后直接删除 cache 。
读 :
- 从 cache 中读取数据,读取到就直接返回
- cache中读取不到的话,就从 DB 中读取数据返回
- 再把数据放到 cache 中。
问题一 “在写数据的过程中,可以先删除 cache ,后更新 DB 么?”
不可以。会导致数据不一致。
请求1先把cache中的A数据删除 -> 请求2从DB中读取数据->请求1再把DB中的A数据更新。
(所以请求二读取的是过时的数据。因为请求一写的数据还没来得及更新到数据库)
问题二
“在写数据的过程中,先更新DB,后删除cache就没有问题了么?”
可能会出现数据不一致性的问题,不过概率非常小,因为缓存的写入速度是比数据库的写入速度快很多!
缺陷1:首次请求数据一定不在 cache 的问题
缺陷2:写操作比较频繁的话导致cache中的数据会被频繁被删除,这样会影响缓存命中率 。
二、读写穿透
与旁路缓存相反
写
- 先查 cache,cache 中不存在,直接更新 DB。
- cache 中存在,则先更新 cache,然后 cache 服务自己更新 DB
读
- 从 cache 中读取数据,读取到就直接返回 。
- 读取不到的话,先从 DB 加载,写入到 cache 后返回响应。
三、异步缓存写入
读写穿透是同步更新 cache 和 DB,而异步缓存写入是只更新缓存,不直接更新 DB,而是改为异步批量的方式来更新 DB。
很明显,这种方式对数据一致性带来了更大的挑战,比如cache数据可能还没异步更新DB的话,cache服务可能就就挂掉了。
写性能非常高,非常适合一些数据经常变化又对数据一致性要求没那么高的场景,比如浏览量、点赞量。