【问题标题】:Auto refresh cache自动刷新缓存
【发布时间】:2016-08-30 17:23:59
【问题描述】:

我使用 django 的内置缓存和 @cache_page 装饰器。但是,我希望缓存能够定期自动刷新,以便用户的实际页面请求不会触发刷新,从而导致延迟。

想到的一个明显策略是使用 celery 任务。我有两个问题:

  1. 如果 celery 任务方法是可以接受的,我需要什么代码来 a) 触发刷新和 b) 未知数量的页面,例如myapp.com/products/?page=2, myapp.com/products/?page=3(我无法预测页数)
  2. 有更好的方法吗?

【问题讨论】:

    标签: django caching


    【解决方案1】:

    我最终使用requests 框架编写了一个 celery 任务,以每小时刷新一次缓存 - 它还处理分页。示例代码:

    @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']
    

    【讨论】:

      【解决方案2】:

      我认为 celery 任务是一种矫枉过正。有一个设置定义了缓存过期:

      CACHE_MIDDLEWARE_SECONDS – 每个页面应该被缓存的秒数。

      参考:Django docs

      这已在 1.8 中引入,会影响 @cache_page 的持续时间。不要将其与用于使用缓存功能的CACHES: TIMEOUT 设置混淆,例如cache.set()。更多关于这个here

      【讨论】:

      • 我了解缓存超时。我要防止的是用户发起的刷新缓存的请求导致延迟 - 我想手动触发缓存刷新。
      • @RunLoop 我明白了。我的理解是用户请求不应该扩展缓存,它是在设置后过期CACHE_MIDDLEWARE_SECONDS,但我们需要挖掘代码来确认这一点。这是一个问题,但当您甚至不想要它并需要手动使其过期时。
      猜你喜欢
      • 2019-07-05
      • 1970-01-01
      • 2013-06-02
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多