8

我想讨论 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 中的时间戳。

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

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

因此,如果我正确理解了这个策略,我们需要对 DB 进行 6 次查询——每个对象 2 次:一个会得到时间戳,第二个是缓存中过期的对象。

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

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

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

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

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

4

0 回答 0