网站建设费用计入什么会计科目,网站seo服务公司,网站建设的报价为什么不同,娱乐网站制作Redis中间件常常被用作缓存#xff0c;而当使用了缓存的时候#xff0c;缓存中数据的维护#xff0c;往往是需要重点关注的#xff0c;尤其是重点考虑的是数据一致性问题。以下是维护数据库缓存的一些常用方案。
1、先删除缓存#xff0c;再更新数据库
导致数据不一致的…Redis中间件常常被用作缓存而当使用了缓存的时候缓存中数据的维护往往是需要重点关注的尤其是重点考虑的是数据一致性问题。以下是维护数据库缓存的一些常用方案。
1、先删除缓存再更新数据库
导致数据不一致的场景 最终结果数据库存储的是新值缓存存储的是旧值导致数据不一致
2、先更新数据库再删除缓存 最终结果A线程删除缓存失败导致缓存中一直存的是旧值。但是实际上删除缓存失败这个异常场景不在此范围讨论中可以加入重试机制因此此方案数据一致性问题不大但是可能导致穿透问题缓存数据删除后瞬间大量请求穿过缓存直接打到数据库。但是但凡是删除缓存都有可能导致穿透问题
3、先更新数据库然后更新缓存 最终结果更新缓存的时间不确定有先有后可能导致旧值覆盖新值的问题。而且性能不好一万次请求就得更新一万次缓存。
4、延时双删
在方案一的基础上增加了一次删除缓存的操作。回想方案一导致数据不一致的问题是A线程在B线程之后更新完数据库后没有去处理缓存数据。因此在更新完数据库后再删除一次缓存便可本质上就是方案一与方案二的结合
总体流程先删除缓存然后再更新数据库更新完数据库后延时再删除一次缓存做兜底操作。
更新数据库前删一次缓存是因为防止在更新数据库后的瞬间有人直接命中缓存拿到旧数据
更新数据库后再删一次缓存是因为有人通过查库拿到旧数据设置值进了缓存方案一数据不一致的情况之所以要延时是因为要保证第二次删除的时机要在其他人写数据之后否则白删。
注意既然是删除缓存数据依然会导致缓存穿透的问题。 根据实际业务场景我选择了方案三先更新数据库再更新缓存。原因如下
1、修改缓存的入口只有一个在控制台中设置不存在多个线程修改缓存的情况
2、读的入口有多个有许多定时器会在自己的业务中读缓存值有并发且量十分大因此需要考虑缓存穿透问题不能删除缓存
3、缓存中存的实际是业务配置读多写少大量更新操作导致性能消耗的场景不存在 每一种方案都存在他的优缺点。在理想中我们往往希望能适用所有场景的方案但是现实往往很骨感一劳永逸的方法几乎只存在于某个乌托邦。方案没有好坏之分只有是否适合自己的应用场景之别。