Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Django缓存中删除所有匹配的密钥_Python_Django_Caching - Fatal编程技术网

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()
方法

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

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

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

一个选项是在您的配置中为该数据类型设置一个,然后调用其
clear()
方法

否则,Django
LocMemCache
将项目存储在实例的
\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)