Python 从Django缓存中删除所有匹配的密钥
我需要遍历服务器的缓存,这是一个Python 从Django缓存中删除所有匹配的密钥,python,django,caching,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') c
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*)
但是,尝试这样做会给我一个
名称错误
,说明未定义全局名称
。还必须注意的是,缓存是不可缓存的。是否有人以类似的方式使用缓存,并提出了一个建议?一个选项是在您的配置中为该数据类型设置一个,然后调用其clear()
方法
否则,DjangoLocMemCache
将项目存储在实例的\u cache
属性中的简单dict
中。由于他们没有为此提供API,您可以直接删除这些项:
for key in cache._cache.keys():
if key.startswith('rl:'):
del cache._cache[key]
通常的免责声明,这是一个不适用于其他缓存类型的实现细节。一个选项是在您的配置中为该数据类型设置一个,然后调用其
clear()
方法
否则,DjangoLocMemCache
将项目存储在实例的\u cache
属性中的简单dict
中。由于他们没有为此提供API,您可以直接删除这些项:
for key in cache._cache.keys():
if key.startswith('rl:'):
del cache._cache[key]
通常的免责声明,这是一个实现细节,不适用于其他缓存类型。
。。。对于缓存中的s,在s中。get(s)
可能无法工作。无法确定s
可能具有哪些值
简单的回答是,如果不对数据模型进行一些更改,那么使用标准缓存API是无法做到这一点的。正如另一个答案所建议的,您可以对这些值使用单独的缓存。或者,您可以拥有一个缓存密钥,它存储以rl:
开头的密钥,这样您就知道要删除什么了
问题是,许多缓存后端实际上除了迭代所有键之外,没有找到与特定值匹配的缓存键的方法。您可能无论如何都不想这样做,因为随着缓存大小的增加,它可能会变得非常昂贵。
。。。对于缓存中的s,在s中。get(s)
可能无法工作。无法确定s
可能具有哪些值
简单的回答是,如果不对数据模型进行一些更改,那么使用标准缓存API是无法做到这一点的。正如另一个答案所建议的,您可以对这些值使用单独的缓存。或者,您可以拥有一个缓存密钥,它存储以rl:
开头的密钥,这样您就知道要删除什么了
问题是,许多缓存后端实际上除了迭代所有键之外,没有找到与特定值匹配的缓存键的方法。无论如何,您可能都不想这样做,因为随着缓存大小的增加,这样做会变得非常昂贵。您的方法遇到了问题。我需要删除密钥名的开始版本。然后我必须强制转换一个列表才能删除(
list(cache.\u cache.keys())
)。我将缓存更改为cache.delete(key.replace(':1:','')
。这是有效的(Django 2.x)我对你的方法有问题。我需要删除密钥名的开始版本。然后我必须强制转换一个列表才能删除(list(cache.\u cache.keys())
)。我将缓存更改为cache.delete(key.replace(':1:','')
。这是可行的(Django 2.x)