基于密钥的缓存过期

Mar*_*oni 8 caching

我想在37signals博客上讨论名为How key-based cache expiration的帖子.我是Django开发人员,而不是RoR,所以这里是Ross Poulton的Django"翻译":Django基于密钥的缓存过期.

正如您所看到的,主要思想如下:我们有"俄罗斯娃娃"结构,其中一个对象包含其他几个级别.

class A:
  timestamp updated_at;

class B:
  A parent;
  timestamp updated_at;

class C:
  B parent;
  timestamp updated_at;
Run Code Online (Sandbox Code Playgroud)

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

  1. 更新C中的时间戳
  2. 更新B中的时间戳.
  3. 更新A中的时间戳

在此之后我们访问A类视图时,我们需要:

  1. 使SELECT从A获取时间戳.
  2. 检查没有带有此时间戳的缓存对象,因此我们需要重新缓存它.
  3. 使SELECT获取A数据.
  4. 使SELECT从B获取所有时间戳.
  5. 获取Bs存在于缓存中.
  6. 使SELECT获取缓存中不存在的Bs.
  7. 使SELECT获取与缓存中不存在的B相关的Cs的所有时间戳.
  8. 从缓存中获取Cs(如果存在).
  9. 使SELECT获取缓存中不存在的Cs.

所以,如果我理解这个策略,我们需要为每个对象做DB-2的6个查询:一个将获得时间戳,第二个 - 对象,在缓存中过时.

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

  1. 获取对象A.
  2. 获取相关对象B.
  3. 获取相关对象C.

据我所知,最好用更多的数据执行3个查询,而不是用更少的6个查询执行.那么这个策略有效吗?

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

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