【问题标题】:Remove all matching keys from Django cache从 Django 缓存中删除所有匹配的键
【发布时间】:2014-10-07 04:23:00
【问题描述】:

我需要遍历我的服务器缓存,它是一个LocMemCache 对象,并删除缓存中以字符串'rl:' 开头的每个键。据我了解,缓存 API django 提供的唯一功能是获取、设置和删除。这是我正在尝试做的一个粗略示例:

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。还必须注意缓存是不可迭代的。有没有人以类似的方式使用缓存,并有建议?

【问题讨论】:

    标签: python django caching


    【解决方案1】:

    一种选择是在您的配置中为这种数据类型添加一个separate, named cache,然后调用它的clear() 方法。

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

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

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

    【讨论】:

    • 我在使用您的方法时遇到了问题。我需要删除密钥名称的起始版本。然后我必须列出一个列表才能删除(list(cache._cache.keys()))。我将cache._cache [key] 更改为cache.delete (key.replace (': 1:', ''))。这有效(Django 2.x)
    【解决方案2】:

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

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

    问题是许多缓存后端实际上没有办法找到与特定值匹配的缓存键,除了遍历所有键。无论如何,您可能都不想这样做,因为随着缓存大小的增加,它会变得非常昂贵。

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 2021-08-01
      • 1970-01-01
      • 2019-10-03
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多