使用Django进行缓存时的一个常见模式是在每个缓存键中使用当前站点的ID,以便实质上为键命名。我遇到的问题是,我希望能够删除命名空间下缓存中的所有值(例如,删除站点45的所有缓存值,因为它们已经进行了一些根本性的更改)。处理此问题的当前模式发送信号到处等等。我使用了Site.id
缓存键示例,因为这是其他人可能识别的常见模式,但我使用缓存的方式是自定义多租户应用程序使这个问题更加深刻,所以我的问题是:是否有一个缓存后端和/或模式适用于以命名空间方式或伪命名方式删除对象,这不是特别昂贵(即,不循环遍历给定命名空间的所有可能的缓存键,删除每个缓存;)我更愿意使用memecached,但我愿意接受任何效果良好的插件,无论是否插件。
答案 0 :(得分:2)
删除大类密钥通常很困难。更好的方法是每个站点都有一个与之关联的世代号。从1开始生成。使用该站点的缓存键中的世代号。当您进行基本更改或任何其他时间想要使站点的整个缓存无效时,请增加站点的世代号。现在所有缓存访问都将丢失,直到所有缓存都重新缓存。所有旧数据仍将在缓存中,但随着它的老化而被丢弃,并且不再被访问。
此方案非常有效,因为它根本不需要查找或触摸所有旧数据。它也可以推广到任何类别的缓存内容,它不必是每个站点。
答案 1 :(得分:1)
我感觉Django的Cache Versioning支持,Django 1.3中的新功能。
它允许您在缓存中设置系统范围的变量VERSION
,或者您可以在创建记录时显式设置它:
cache.set("mykey", True, version=2)
使用这种方法,当您需要更新缓存时,只需更新VERSION
即可。