使多个分组缓存键无效

gue*_*tli 6 django caching

我的模型TicketType有大约500个实例.

它每周只变化几次.

但是如果它发生了变化,我需要使用旧的TicketTypes的所有缓存值无效.

不幸的是,一些缓存键不是固定的.它们包含计算数据.

我看到这些解决方案:

使用version参数并更新post保存信号处理程序的版本值TicketType.

对所有基于TicketType的缓存键使用公共前缀.然后使后保存信号处理程序中的所有缓存键无效.

我想有第三种,更好的方法......

例:

TicketType是一棵树.TicketTypes的可见性绑定到权限.如果树具有不同的权限,则两个用户可能会以不同的方式查看树.我们根据权限缓存它.用户的权限被序列化和散列.通过创建包含哈希和固定部分的字符串来创建缓存键:

hash_key='ticket-type-tree--%s' % hashed_permissions
Run Code Online (Sandbox Code Playgroud)

如果TicketType树发生更改,我们需要确保没有从缓存中加载旧数据.只要不使用旧数据,就不需要主动无效.

dno*_*zay 1

您可以使用票证修改时间作为缓存键的一部分。

hash_key = 'ticket-type-tree--%s-%s' % (hashed_permissions, tree.lastmodified)
Run Code Online (Sandbox Code Playgroud)

您可以添加一个DateTimeFieldwith auto_now=True. 如果从数据库获取修改时间的成本太高,您也可以缓存它。

通常,更新信号处理程序中的缓存post_save就可以了。除非你想时刻拥有一致的数据,并且想为交易支付额外的费用。