我需要遍历我的服务器缓存,这是一个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
。还必须注意,缓存不可迭代。有没有人以类似的方式使用缓存,并有一个建议?
答案 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:
开头的键,以便您知道要删除的内容。
问题在于,除了遍历所有密钥之外,许多缓存后端实际上没有办法找到匹配特定值的缓存密钥。您可能不想这样做,因为随着缓存大小的增加,它会变得非常昂贵。