【发布时间】:2015-05-07 11:50:56
【问题描述】:
我有模型 TicketType,它有大约 500 个实例。
每周只更换几次。
但如果它发生变化,我需要使所有使用旧 TicketTypes 的缓存值无效。
很遗憾,有些缓存键没有固定。它们包含计算数据。
我看到了这些解决方案:
使用version 参数并在TicketType 的保存后信号处理程序上更新版本值。
为所有基于 TicketType 的缓存键使用一个公共前缀。 然后在后保存信号处理程序中使所有缓存键无效。
我想还有第三种更好的方法...
例子:
TicketType 是一棵树。 TicketTypes 的可见性与权限绑定。如果两个用户具有不同的权限,他们可能会以不同的方式查看树。我们根据权限缓存它。用户的权限被序列化和散列。缓存键是通过创建一个包含哈希和固定部分的字符串来创建的:
hash_key='ticket-type-tree--%s' % hashed_permissions
如果 TicketType 树发生变化,我们需要确保不会从缓存中加载旧数据。只要不使用旧数据,就不需要主动失效。
【问题讨论】:
-
能否请您详细说明一下您的模型、缓存的内容以及您确定缓存键的方式?
-
@Marcanpilami 我更新了问题。
-
能否请您展示您的 TicketType 模型以及您明确放入缓存中的内容?
-
还有多少个用户?您是否在密钥中使用哈希,因为权限集是重复的并且树很大?
-
是的,权限集是重复的。这些树并不大,但计算它们需要一些时间。对于树中的每个节点,都会执行一个 SQL 计数查询。计数很慢。这就是我们进行缓存的原因。