基于密钥的缓存过期

时间:2012-05-27 14:34:39

标签: caching

我想在名为How key-based cache expiration works的37signals博客上讨论帖子。我是Django开发人员,而不是RoR,所以这里是Ross Poulton的Django“翻译”:Key-based cache expiration with Django

正如你所看到的,主要思想如下:我们有“俄罗斯娃娃”结构,其中一个对象包含其他几个层次。

class A:
  timestamp updated_at;

class B:
  A parent;
  timestamp updated_at;

class C:
  B parent;
  timestamp updated_at;

类A的对象的视图(例如,HTML)与所有相关对象一起缓存。当C类更新时,我们需要:

  1. 更新C中的时间戳。
  2. 更新B中的时间戳。
  3. 更新A中的时间戳。
  4. 在此之后访问A类视图时,我们需要:

    1. 让SELECT从A。获取时间戳。
    2. 检查,此时间戳没有缓存对象,所以我们 需要重新安排它。
    3. 使SELECT获取A数据。
    4. 使SELECT获取B的所有时间戳。
    5. 获取Bs存在于缓存中。
    6. 使SELECT获取缓存中不存在的B。
    7. 使SELECT获取与B相关的Cs的所有时间戳 存在于缓存中。
    8. 从缓存中获取Cs(如果存在)。
    9. 使SELECT获取缓存中不存在的Cs。
    10. 所以,如果我理解这个策略,我们需要为每个对象做DB-2的6个查询:一个将获得时间戳,第二个 - 对象,在缓存中过时。

      相反,如果我们将重置所有数据,我们只需要进行3次查询:

      1. 获取对象A.
      2. 获取相关对象B.
      3. 获取相关对象C.
      4. 据我所知,使用更多数据执行3个查询而不是使用更少的6个查询更好。那么这个策略有效吗?

        当然,我们也可以在缓存中存储时间戳,但在这种情况下,我们将面临时间戳无效的问题。因此,对于需要避免失效的策略的数据无效是没有意义的。

        如果我对理解该算法的范围或工作原理有误,请纠正我。

0 个答案:

没有答案