【发布时间】:2014-10-05 12:49:47
【问题描述】:
我一直在使用数据库缓存在 Django 中设置缓存。有两个设置 TIMEOUT 和 CACHE_MIDDLEWARE_SECONDS 控制页面缓存的时间。这两种设置有什么区别?
【问题讨论】:
标签: django django-cache
我一直在使用数据库缓存在 Django 中设置缓存。有两个设置 TIMEOUT 和 CACHE_MIDDLEWARE_SECONDS 控制页面缓存的时间。这两种设置有什么区别?
【问题讨论】:
标签: django django-cache
确实,相应的文档并没有充分解释这些差异。
第一个选项CACHES:TIMEOUT 在Django cache framework, Cache arguments 中引入。如果未提供其他功能,则它是在 cache.set() 等函数中使用的默认过期时间。这后来记录在low-level cache API usage。
后者CACHE_MIDDLEWARE_SECONDS在Django cache framework, The per-site cache中引入。因此,可以安全地假设它是所有页面的默认到期时间,就好像 @cache_page(settings.CACHE_MIDDLEWARE_SECONDS) 将在 per-view 的基础上使用一样。
【讨论】:
TIMEOUT 只影响服务器端缓存,而CACHE_MIDDLEWARE_SECONDS 影响客户端和服务器端缓存。我说的对吗?
我有同样的问题,现有的答案仍然没有为我解决。所以我决定深入研究源代码。支持开源!
CACHE_MIDDLEWARE_SECONDS 被UpdateCacheMiddleware 中间件使用。如果视图尚未设置 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)这个代码意味着缓存中的数据将无限期保留?
cache.set 的默认超时是TIMEOUT setting。
根据http://www.djangobook.com/en/2.0/chapter15.html,TIMEOUT 是连接到缓存后端的超时时间,CACHE_MIDDLEWARE_SECONDS 是缓存页面的秒数。所以 TIMEOUT 不一定对所有后端都有用。
【讨论】: