我想讨论 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 类更新时,我们需要:
- 更新 C 中的时间戳。
- 更新 B 中的时间戳。
- 更新 A 中的时间戳。
当我们在此之后访问 A 类的视图时,我们需要:
- 进行 SELECT 以从 A 获取时间戳。
- 检查,没有具有此时间戳的缓存对象,因此我们需要重新缓存它。
- 进行 SELECT 以获取 A 数据。
- 进行 SELECT 以从 B 获取所有时间戳。
- 获取 B 存在于缓存中。
- 进行 SELECT 以获取缓存中不存在的 B。
- 进行 SELECT 以获取缓存中不存在的与 Bs 相关的 Cs 的所有时间戳。
- 从缓存中获取 Cs(如果存在)。
- 进行 SELECT 以获取缓存中不存在的 C。
因此,如果我正确理解了这个策略,我们需要对 DB 进行 6 次查询——每个对象 2 次:一个会得到时间戳,第二个是缓存中过期的对象。
相反,如果我们要重置所有数据,我们只需要进行 3 次查询:
- 获取对象 A。
- 获取相关对象 B.
- 获取相关对象 C.
据我所知,用更多数据执行 3 个查询而不是用更少数据执行 6 个查询会更好。那么这个策略有效吗?
当然,我们也可以将时间戳存储在缓存中,但是在这种情况下,我们将面临时间戳失效的问题。因此,为需要避免失效的策略使数据失效是没有意义的。
如果我对该算法的范围或工作原理的理解有误,请纠正我。