文章目录
  1. Cache Aside Pattern
  2. 对比
    1. 方式一:先删缓存再更新数据库
    2. 方式二:先更新数据库再删缓存
    3. 方式三:读操作不更新缓存,写完数据后更新缓存

缓存失效的更新策略阅读思考

原文链接
缓存失效的策略有很多种,详细的介绍参考原文,这里主要思考其中最常用的一种策略的问题。

Cache Aside Pattern

最常用的缓存设计模式:

  • 失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
  • 命中:应用程序从cache中取数据,取到后返回。
  • 更新:先把数据存到数据库中,成功后,再让缓存失效。

    对比

    在读策略都一样时,对比先删缓存再更新数据库,两种方式在读写并发下都会出现脏数据的问题,但是出问题的条件存在很大的区别。

方式一:先删缓存再更新数据库

出问题的条件:

  1. 缓存失效
  2. 读请求先进入(因为更新操作一般会加锁s),读数据耗时 < 写数据耗时(读操作先完成)

方式二:先更新数据库再删缓存

出问题的条件:

  1. 缓存失效
  2. 读请求先进入, 读耗时 > 写耗时(读操作在写操作完成后完成)

正常情况下,写数据都是比读耗时时间长。另外,在方式一中,先删缓存,增加了缓存失效的概率。因此可以看出来方式一出现脏数据的可能性明显大于使用方式二。实际上方式二出现脏数据的可能性很低。

方式三:读操作不更新缓存,写完数据后更新缓存

这种方式下,出问题的条件变得更加简单:当出现并发的写操作,如果更新缓存的耗时较长,就有可能出现。对于写操作并发高的网站,这种条件很容易满足。