Cache Aside Pattern(旁路缓存模式)
Cache Aside Pattern 中服务端需要同时维系 DB 和 cache,并且是以 DB 的结果为准。
下面我们来看一下这个策略模式下的缓存读写步骤。
写 :
-
先更新 DB
-
然后直接删除 cache 。
简单画了一张图帮助大家理解写的步骤。
读 :
-
从 cache 中读取数据,读取到就直接返回
-
cache中读取不到的话,就从 DB 中读取数据返回
-
再把数据放到 cache 中。
Cache Aside Pattern 有一定的缺陷:
缺陷1:首次请求数据一定不在 cache 的问题
解决办法:可以将热点数据可以提前放入cache 中。
缺陷2:写操作比较频繁的话导致cache中的数据会被频繁被删除,这样会影响缓存命中率 。
解决办法:
-
数据库和缓存数据强一致场景 :更新DB的时候同样更新cache,不过我们需要加一个锁/分布式锁来保证更新cache的时候不存在线程安全问题。
-
可以短暂地允许数据库和缓存数据不一致的场景 :更新DB的时候同样更新cache,但是给缓存加一个比较短的过期时间,这样的话就可以保证即使数据不一致的话影响也比较小。
有以下两个问题:
在写数据的时候可以先删除Cache,再更改db吗?
解答:当然不可以,会造成数据不一致,比如请求1要写入A数据,在请求1删除了Cache后,请求2要读A数据,然后请求1在请求2读完数据后才写入A数据,这样请求2读到的数据其实是旧数据,造成数据不一致。
在写数据的过程中,先更新DB,后删除cache就没有问题吗?
解答:理论上来说还是可能会出现数据不一致性的问题,不过概率非常小,因为缓存的写入速度是比数据库的写入速度快很多!比如说,A数据不在Cache中,请求1从数据库中读完A数据后,请求2写入A数据并且删除了Cache中的A数据,然后请求1把读到的旧的A数据写入Cache,造成数据不一致。