Django 删除具有特定 key_prefix 的缓存

新手上路,请多包涵

我正在使用 Django 的每个视图 @cache_page 装饰器,并为每个视图设置了不同的 key_prefix

我之前删除了缓存:

 from django.core.cache import cache
cache.clear()

但是,如果我只想删除包含特定 key_prefix 的密钥怎么办?我显然可以通过连接到数据库并使用原始 sql 删除来做到这一点,但我想知道是否可以使用“纯”Django 来完成?

我使用的是数据库缓存,而不是内存缓存。

我正在使用 Django 1.11 和 Python 3.6

原文由 Wessi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 714
2 个回答

正如 @e4c5 提到的缓存用于快速的东西,你应该使用 redis 来做同样的事情。但是由于您的问题是关于数据库的,所以我会回答相同的问题。

在 Django 中没有现成的功能可以做到这一点。但是 python 最好的部分是你可以轻松地使用猴子路径来添加新功能。下面是我创建的测试请求

def index(request):
    cache.set("name", "tarun")
    cache.set("name_1", "tarun")
    cache.set("name2", "tarun")
    cache.set("name_4", "tarun")
    cache.set("nam", "tarun")

    cache.clear(prefix="name")
    nam = cache.get("nam")
    name_4 = cache.get("name_4", default="deleted")
    return HttpResponse("Hello, world. nam={nam}, name_4={name_4}".format(nam=nam, name_4=name_4))

修补

要获得 prefix 功能,您需要在某个地方添加以下补丁代码。我用 settings.py 这样

original_clear = None

def patch_clear():
    from django.db import connections, router
    from django.core.cache.backends.db import DatabaseCache

    def __clear(self, prefix=None, version=None):
        db = router.db_for_write(self.cache_model_class)
        connection = connections[db]
        table = connection.ops.quote_name(self._table)
        with connection.cursor() as cursor:
            if prefix is None:
                cursor.execute('DELETE FROM %s ' % table)
            else:
                prefix = self.make_key(prefix, version)
                cursor.execute("DELETE FROM %s where cache_key like '%s%%'" % (table, prefix))

    global original_clear
    original_clear = DatabaseCache.clear
    DatabaseCache.clear = __clear

patch_clear()

原文由 Tarun Lalwani 发布,翻译遵循 CC BY-SA 3.0 许可协议

我用这样的代码实现了我想要的:

 cache.delete_many(keys=cache.keys('*.letters.*'))

它删除所有键包含“字母”的缓存。

编辑:我使用 redis 服务器。我没有为其他缓存服务器测试它。

原文由 Soyuzbek Orozbek Uulu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题