【问题标题】:Django cache framework. What is the difference between TIMEOUT and CACHE_MIDDLEWARE_SECONDS?Django 缓存框架。 TIMEOUT 和 CACHE_MIDDLEWARE_SECONDS 有什么区别?
【发布时间】:2014-10-05 12:49:47
【问题描述】:

我一直在使用数据库缓存在 Django 中设置缓存。有两个设置 TIMEOUT 和 CACHE_MIDDLEWARE_SECONDS 控制页面缓存的时间。这两种设置有什么区别?

【问题讨论】:

    标签: django django-cache


    【解决方案1】:

    确实,相应的文档并没有充分解释这些差异。

    第一个选项CACHESTIMEOUTDjango cache framework, Cache arguments 中引入。如果未提供其他功能,则它是在 cache.set() 等函数中使用的默认过期时间。这后来记录在low-level cache API usage

    后者CACHE_MIDDLEWARE_SECONDSDjango cache framework, The per-site cache中引入。因此,可以安全地假设它是所有页面的默认到期时间,就好像 @cache_page(settings.CACHE_MIDDLEWARE_SECONDS) 将在 per-view 的基础上使用一样。

    【讨论】:

    • TIMEOUT 只影响服务器端缓存,而CACHE_MIDDLEWARE_SECONDS 影响客户端和服务器端缓存。我说的对吗?
    【解决方案2】:

    我有同样的问题,现有的答案仍然没有为我解决。所以我决定深入研究源代码。支持开源!

    CACHE_MIDDLEWARE_SECONDSUpdateCacheMiddleware 中间件使用。如果视图尚未设置 Cache-Control (max-age) 标头,则将其设置为 CACHE_MIDDLEWARE_SECONDS 的值,从而影响客户端缓存。代码如下:

        self.cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
        # ...
        timeout = get_max_age(response)
        if timeout is None:
            timeout = self.cache_timeout
        patch_response_headers(response, timeout)
    

    (请注意,我剪掉了一些代码和边角,以便于阅读,您当然可以自己阅读 the full source 代码。)

    它还将响应保存在服务器端缓存中,使用源自 MIDDLEWARE_CACHE_SECONDS 的相同超时值,覆盖 TIMEOUT 设置(如果已设置):(context)

        if timeout:
            cache_key = learn_cache_key(request, response, timeout, self.key_prefix, cache=self.cache)
            self.cache.set(cache_key, response, timeout) 
    

    中间件FetchFromCacheMiddleware搭配UpdateCacheMiddleware,使用后者设置的服务端缓存值,因此间接受到CACHE_MIDDLEWARE_SECONDS的影响。

    替代中间件CacheMiddleware 也使用CACHE_MIDDLEWARE_SECONDS。除非您使用 CacheMiddleware,否则这不会影响您。

    那么TIMEOUT 设置的意义何在?我想这是直接写入缓存时使用的默认值,但前面提到的中间件不使用它。例如:

    from django.core.cache import cache
    cache.set('my_key', 'my_value') # uses TIMEOUT value as default
    

    【讨论】:

    • 抱歉,这里的默认超时时间是多少?比如cache.set("my_key", ''my_value", timeout=none)这个代码意味着缓存中的数据将无限期保留?
    • @KaramQusai cache.set 的默认超时是TIMEOUT setting
    【解决方案3】:

    根据http://www.djangobook.com/en/2.0/chapter15.html,TIMEOUT 是连接到缓存后端的超时时间,CACHE_MIDDLEWARE_SECONDS 是缓存页面的秒数。所以 TIMEOUT 不一定对所有后端都有用。

    【讨论】:

    • 感谢您的回答,但我不确定我是否理解其中的区别。根据文档docs.djangoproject.com/en/1.6/ref/settings/… Timeout 是“缓存条目被视为陈旧之前的秒数”。这是否与“TIMEOUT 是连接到缓存后端的超时时间”的意思相同?
    • 你说得对,我的错。我给出的参考资料,用它自己的话说,“非常过时”。由于 Django 缓存提供了比整个页面更精细的访问权限,我猜这就是 TIMEOUT 的用途。 CACHE_MIDDLEWARE 只能处理整个页面,因此您可能需要不同的超时时间。我们必须查阅代码才能确定。
    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 2019-06-05
    • 2022-10-13
    • 2011-04-11
    • 2021-04-28
    • 1970-01-01
    • 2017-07-15
    • 2017-04-26
    相关资源
    最近更新 更多