缓存的更新策略

84 阅读2分钟

一、缓存的更新策略

缓存的更新策略大致可以分为三大类:缓存淘汰策略、超时剔除、主动更新

具体内容:

前面两种策略,由我们对其控制是比较低的,所以这里我只讲解主动更新策略,该策略需要我们考虑的问题是比较多的。当我们操作数据库和缓存时有三个问题是需要我们考虑。

  1. 删除缓存还是更新缓存?
  • 更新缓存:每次更新数据都更新缓存,当操作的场景属于读多写少的场景,就会导致无效写操作比较多(×)
  • 删除缓存:每次更新数据库删除缓存,当查询时写回数据库。 (√)
  1. 如何保证缓存与数据库的操作同时成功或失败?
  • 单体系统:将缓存与数据库的操作放到同一个事务中,通过事务来保证操作的一致性
  • 分布式系统:利用TCC等事务分布式事务方案
  1. 先删缓存还是后删缓存?
  • 先删缓存,再操作数据库
  • 先操作数据库,再删缓存

上面第3点是重点内容,其实两种方案都是有问题的,需要根据具体的场景以及需求来决定:

先删缓存,再操作数据库会出现的问题:

当线程先删除缓存以后,在去更新数据库的期间由于网络原因等原因,导致在此期间有新的线程进行数据的查询,并且完成缓存的回写,然后旧的线程才完成缓存的写操作。这时就导致缓存和DB的数据不一致,并且该情况高发

先操作数据库,再删缓存的问题:

当线程更新数据后,就删除了缓存,然后此时有一个新线程来查询数据,发现缓存为空,就会去数据库中查询到数据但还没有写回缓存,而此时又有一个新的线程更新数据并且删除缓存,然后之前的线程才写回缓存,此时缓存的数据为旧的数据。但是该情况的发生概率是比较

还有其他的方案吗?

答案肯定是有的,比如缓存双删、binlog日志异步更新缓存

缓存双删: 先删缓存,再更新数据,过一段时间再删除缓存,他主要就是解决先删缓存,再更新数据库的问题,但是他依旧存在一定问题,就是缓存的删除的时间控制不好确定,需要针对具体情况而定

binlog更新缓存: 先更新数据库,通过cannal监听binlog日志,记录修改日志,然后通过异步消息队列+重试机制(解决网络问题导致的失败)实现缓存更新。该方案