如何在特定时间(例如午夜)清除Django模板缓存?

时间:2014-04-11 11:40:02

标签: django caching

据我所知,Django的缓存功能在指定的时间间隔过后(例如1分钟,1小时等)过期,但我有一些内容每天都在变化(例如“当天的消息”)。理想情况下,这将被缓存24小时,但如果我将超时设置为24小时,则无法保证缓存将在午夜准确到期。处理这种情况的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

两个简单的选项都会浮现在脑海中,两者都涉及需要在(比如)午夜运行的计划任务。

1)领先于游戏:安排一些代码运行(例如自定义管理命令),要求您提供当天的消息'午夜的内容,24小时到期。 (这假设尚未设置相关的缓存键)

2)Go nuclear:在午夜安排缓存清除

或者,将两者结合起来:

不要去核,只是安排一个电话只在午夜删除MOTD键(例如cache.delete(' motd_key'),然后再缓存新的。

或者,如果您使用Redis作为缓存后端,则可以缓存MOTD,然后进行EXPIREAT调用以将缓存的MOTD条目设置为在23:59:59到期。 redis.py会让你以Pythonic的方式做到这一点。

如果您使用Memcached作为后端,则无法获得该级别的控制权。

(如果您正在使用locmem://,那么你做错了; o))

答案 1 :(得分:1)

为什么不直接实现自定义缓存,而不是引入其他副作用,例如计划作业?

像这样创建一个缓存类:

from datetime import datetime, timedelta

from django.core.cache.backends.locmem import LocMemCache


class MidnightCacher(LocMemCache):

    def __init__(self, name, params):
        super().__init__(name, params)

    def get_backend_timeout(self, timeout=None):
        # return time until midnight
        return (datetime.utcnow() + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0).timestamp()

在 settings.py 中配置缓存

CACHES = {
    'midnight': {
        'BACKEND': 'backend.midnight_cache.MidnightCacher',
        'LOCATION': 'unique-snowflake',
    }
}

最后,装饰您的视图:

@cache_page(1, cache="midnight")
def get_comething(request):
    pass