缓存更新策略

对于缓存更新的策略在很多情况下用户不知道怎么去取舍,接下来将用这篇文章来帮助你对缓存更新策略有一个更加深刻印象!

1、缓存更新的三种方式

1.1、图解对比三种策略

image-20220315094849686

1.2、业务场景

低一致性需求:使用内存淘汰机制。例如美团界面的店铺分类的查询缓存,他不会总更新!

高一致性需求:主动更新,并以超时提出作为兜底方案。例如商铺的详情信息查询的缓存等!

2、主动更新策略

image-20220315090741300

a.第一种虽然有些麻烦但是通过自己手动编码的方式很好的控制缓存和数据库中的数据的一致性。

b.第二种将缓存的功能单独抽取出一个单独的服务,每当缓存更新后就将进行数据库的写操作,因为操作者接触不到缓存的过程,因此无法保证缓存的一致性!

c.由于操作者只操作缓存数据,可能使用了100次的缓存调用,异步请求也没有完成一次写入数据库的操作,虽然可以保证最终的数据一致性,但是在异步保存的过程中无法保证数据的一致性!

3、操作缓存和数据库时的三个问题

3.1、删除缓存还是更新缓存?

更新缓存:每次更新数据库都更新缓存,造成无效写操作过多。

删除缓存:更新数据库时让缓存失败,查询时在更新数据库。

3.2、如何保证缓存与数据库的操作的同时成功或失败?

单体系统:将缓存与数据库放在一个事务

分布式系统:了TCC等分布式事务方案

3.3、先操作缓存还是先操作数据库?

先删除缓存,再操作数据库

先操作数据库,再删除缓存

4、删除缓存和操作数据库的过程

这里我们只研究不理想的情况进行分析和比对

4.1、先删除缓存,再操作数据库

image-20220315092946817

线程一来之前缓存和数据库的值假如都是10,此时线程一先删除缓存,在线程一还没有完全更新好数据库前,线程二发现缓存已经不在了,就去查询数据库,数据库的查询操作要比写操作快的多,查出来的值还是10,然后线程二将10再次写入缓存当中。就在这时线程一完成了数据库的更新降至改为了20,此时缓存和数据库就不一致了!

4.2、先操作数据库,在删除缓存

image-20220315093400225

这种情况的前提时缓存在刚开始的时候就没有生效可能由于缓存时间到了等一系列因素,这时缓存不存在,数据库的值为10。线程一查询缓存未命中去查询数据库,在查询数据库的同时,线程二更新了数据库的值为20,并删除了缓存。这时候线程一将查询出来的数据10写入缓存,此时就造成了数据不一致的问题!

4.3、总结

虽说两种操作都会照成数据不一致的问题,但是总结分析比较后发现后者出现错误的概率更小一些,一方面缓存不会随意的消失,因此方案二出错的概率极低,但是为了防止方案二的错误产生,可以给缓存加上有效期,保证数据的一致性!

Q.E.D.


欢迎来到xuan的空间~