缓存在django中过期后自动缓存视图

时间:2016-10-24 21:27:34

标签: django caching

我在views.py

中有这个
@cache_page(60 * 5)
def get_campaign_count(request):
    return HttpResponse(
        json.dumps({
            'count': Campaign.objects.get_true_campaign_query().filter(dismissed=False).count()
        },
            cls=DjangoJSONEncoder
        ),
        content_type='application/json')

每次加载计数都需要一些时间(20-40秒),因此我决定在5分钟的到期时间内为其添加缓存。我的问题是,是否有可能告诉django在到期期间自动重新缓存页面?否则,在其他用户从缓存中受益之前,另一个用户必须经过20-40秒等待才能获得响应。

1 个答案:

答案 0 :(得分:2)

没有任何开箱即用的东西。你最好的选择可能是每隔5分钟运行一个后台任务(来自crontab或芹菜的django manage命令)并在某个键下手动缓存该值(过期设置为永不过期),然后通过键在视图中读取它(不再需要整页缓存)。我认为这是保持100%请求缓存并且不返回任何陈旧数据(超过5分钟)的唯一方法。

如果您不介意在经过5分钟后向第一个用户显示陈旧数据,那么您可以将时间戳与缓存中的值一起存储,以标记上次刷新此缓存的时间。然后,此时间戳可用于手动检查自上次刷新以来是否已经过了5分钟(这是为了对过期值不返回任何内容的memcached标准行为进行战斗)。如果已经过了5分钟,请立即将过时的缓存值返回给用户,并生成后台线程以更新缓存的值。