我使用django的内置缓存与@cache_page
装饰器。但是,我希望自动刷新缓存,以便刷新不会因用户的实际页面请求而触发,从而导致延迟。自动刷新缓存
想到一个明显的策略是使用芹菜任务。我有两个问题请:
- 如果芹菜任务方法是可以接受的,我需要什么代码a)触发刷新和b)未知数量的页面,例如, myapp.com/products/?page=2,myapp.com/products/?page=3(我无法预测页数)
- 有没有更好的方法?
我使用django的内置缓存与@cache_page
装饰器。但是,我希望自动刷新缓存,以便刷新不会因用户的实际页面请求而触发,从而导致延迟。自动刷新缓存
想到一个明显的策略是使用芹菜任务。我有两个问题请:
我最终编写了一个使用requests框架的芹菜任务,每小时刷新缓存 - 它也处理分页。示例代码:
@shared_task
def refresh_caches():
header = {"Content-Type": "application/json; charset=utf-8",
"Authorization": settings.USER_TOKEN}
next_page_url = settings.API_URL +'/products/'
while len(next_page_url) > 0:
response = requests.get(next_page_url, headers=header)
next_page_url = ''
jsonresponse = response.json()
if jsonresponse.get('next'):
next_page_url = jsonresponse['next']
我认为这是一个芹菜任务是一个矫枉过正。有一个定义缓存过期的设置:
CACHE_MIDDLEWARE_SECONDS
- 每个页面应该被缓存的秒数。
参考:Django docs
这已在1.8推出,并影响@cache_page
时间。不要将它与用于使用缓存功能的CACHES: TIMEOUT
设置混淆,例如cache.set()
。更多关于这个here。
我明白缓存超时。我想要阻止的是用户启动的请求刷新缓存导致延迟 - 我想手动触发缓存刷新。 – RunLoop
@RunLoop我明白了。我的理解是用户请求不应该扩展缓存,它将在设置后到期'CACHE_MIDDLEWARE_SECONDS',但我们需要挖掘代码来确认这一点。这是一个问题,虽然你甚至不需要甚至需要手动过期。 – Wtower