【问题标题】:Django database cache TIMEOUT - make backend delete rowDjango 数据库缓存 TIMEOUT - 使后端删除行
【发布时间】:2019-04-14 16:04:20
【问题描述】:

我不确定Django 数据库缓存对过期条目的作用,但它们似乎仍保留在数据库中。

我希望Django 在它们过期后删除它们,因为它们的大小很大并且可以有无限数量的不同密钥。

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'cache_table',
        'TIMEOUT': 60 * 20,
    }
}

我在过滤的对象列表上使用cache,此过滤器包含数字和字符字段。

有可能吗?

【问题讨论】:

    标签: python django caching django-database django-cache


    【解决方案1】:

    无法清除过期条目,因为它们已过期。这是您可能不想在生产中使用数据库缓存的众多原因之一!

    如果可能,您应该切换到不同的缓存后端(我更喜欢 Redis)。如果不能,您还有其他一些选择:

    1. 如果知道要清除的缓存键,可以使用the low-level cache API直接删除要清除的键。

    2. 您可以调整 MAX_ENTRIES 和/或 CULL_FREQUENCY cache arguments 以限制缓存的整体大小。

    3. 您可以直接进入数据库(可能来自后台任务或 cron 作业),手动运行一些 SQL,如 DELETE FROM cache_table WHERE expires < now()(我还没有测试过,但我认为它应该可以工作)。

    【讨论】:

    • 似乎值得注意的是,虽然某些后台进程通常不会删除行,但 timeout 参数确实有效。它仅在读取缓存时起作用。我不确定行是否已过期是否在此时被删除,但是如果您的客户端尝试get() 过期的缓存条目,它将获得None。我刚刚更新了the docs 并提供了一些相关信息。
    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 2016-09-05
    • 2021-07-11
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    相关资源
    最近更新 更多