从Django缓存中删除所有匹配的键

时间:2014-08-13 17:22:25

标签: python django caching

我需要遍历我的服务器缓存,这是一个LocMemCache对象,并删除缓存中以字符串'rl:'开头的每个密钥。据我所知,缓存API django提供的唯一功能是get,set和delete。这是我想要做的一个粗略的例子:

def clear_ratelimit_cache():
    if any('rl:' in s for s in cache.get(s)): 
        log.info(
            'FOUND SOMETHING') 
        cache.delete(*something else here*)

但是,尝试执行此操作会给我一个NameError,说明global name 's' is not defined。还必须注意,缓存不可迭代。有没有人以类似的方式使用缓存,并有一个建议?

2 个答案:

答案 0 :(得分:4)

一种选择是在配置中只为此数据类型添加separate, named cache,然后调用其clear()方法。

否则,Django LocMemCache将项目存储在实例的dict属性中的简单_cache中。由于他们没有为您提供API,您可以直接删除项目:

for key in cache._cache.keys():
    if key.startswith('rl:'):
        del cache._cache[key]

通常的免责声明,这是一个不适用于其他缓存类型的实现细节。

答案 1 :(得分:0)

... in s for s in cache.get(s)不可行。无法确定s可能具有的值。

简短的回答是,如果不对数据模型进行一些更改,则无法使用标准缓存API执行此操作。正如另一个答案所示,您可以为这些值使用单独的缓存。或者,您可以使用缓存键来存储以rl:开头的键,以便您知道要删除的内容。

问题在于,除了遍历所有密钥之外,许多缓存后端实际上没有办法找到匹配特定值的缓存密钥。您可能不想这样做,因为随着缓存大小的增加,它会变得非常昂贵。

相关问题