Django / 一般缓存问题

1 投票
2 回答
788 浏览
提问于 2025-04-17 02:29

在使用Django进行缓存时,一个常见的做法是把当前网站的ID放在每个缓存键里,这样可以给你的缓存键加上一个“命名空间”。这样做的好处是可以避免不同网站之间的缓存冲突。不过,我遇到的问题是,我希望能够删除某个命名空间下的所有缓存值(比如说,删除网站45的所有缓存值,因为他们做了一些重要的改动)。目前的处理方式是发送各种信号,这样做有点麻烦。我提到Site.id这个缓存键的例子,是因为这是一个大家都比较熟悉的做法,但我在一个自定义的多租户应用中使用缓存,这让问题变得更加复杂。所以我的问题是:有没有一种缓存后端或者模式,可以有效地以命名空间的方式删除对象,或者说伪命名空间的方式,而且不会特别耗费资源(也就是说,不用一个个遍历所有可能的缓存键来删除缓存)?我更倾向于使用memcached,但也愿意尝试任何有效的解决方案,无论是否是插件。

2 个回答

1

我觉得Django的缓存版本控制功能是在Django 1.3中新增的。

这个功能让你可以在整个系统中设置一个叫做VERSION的变量,用于你的缓存,或者在创建记录的时候你也可以明确地设置这个变量:

cache.set("mykey", True, version=2)

使用这个方法,当你需要更新缓存的时候,只需简单地提高VERSION的值,就可以了。

2

删除大量的键值对通常是很麻烦的。一个更好的办法是给每个网站分配一个代号,叫做“代数”。从1开始。然后在这个网站的缓存键中使用这个代数。当你做了重大更改,或者任何时候想要清空这个网站的缓存时,就把这个代数加1。这样一来,所有的缓存访问都会失败,直到所有的新数据重新被缓存。虽然旧的数据还在缓存里,但随着时间的推移,它们会被丢弃,因为没人再去访问它们。

这个方法非常高效,因为它根本不需要去查找或处理所有旧的数据。而且这个方法可以应用到任何类型的缓存内容,不一定非得是针对某个网站的。

撰写回答