我的模型TicketType有大约500个实例.
它每周只变化几次.
但是如果它发生了变化,我需要使用旧的TicketTypes的所有缓存值无效.
不幸的是,一些缓存键不是固定的.它们包含计算数据.
我看到这些解决方案:
使用version参数并更新post保存信号处理程序的版本值TicketType.
对所有基于TicketType的缓存键使用公共前缀.然后使后保存信号处理程序中的所有缓存键无效.
我想有第三种,更好的方法......
例:
TicketType是一棵树.TicketTypes的可见性绑定到权限.如果树具有不同的权限,则两个用户可能会以不同的方式查看树.我们根据权限缓存它.用户的权限被序列化和散列.通过创建包含哈希和固定部分的字符串来创建缓存键:
hash_key='ticket-type-tree--%s' % hashed_permissions
Run Code Online (Sandbox Code Playgroud)
如果TicketType树发生更改,我们需要确保没有从缓存中加载旧数据.只要不使用旧数据,就不需要主动无效.
您可以使用票证修改时间作为缓存键的一部分。
hash_key = 'ticket-type-tree--%s-%s' % (hashed_permissions, tree.lastmodified)
Run Code Online (Sandbox Code Playgroud)
您可以添加一个DateTimeFieldwith auto_now=True. 如果从数据库获取修改时间的成本太高,您也可以缓存它。
通常,更新信号处理程序中的缓存post_save就可以了。除非你想时刻拥有一致的数据,并且想为交易支付额外的费用。