【问题标题】:Django cache_page - prepopulate/pre-cacheDjango cache_page - 预填充/预缓存
【发布时间】:2021-10-26 17:09:29
【问题描述】:

我有一个数据库查询在生产中需要几秒钟。我还有一个返回此查询的 DRF ViewSet 操作。

我已经使用cache_page 缓存了这个action

@method_decorator(cache_page(settings.DEFAULT_CACHE_TIMEOUT))
@action(detail=False)
def home(self, request) -> Response:
    articles = Article.objects.home()
    return Response(serializers.ArticleListSerializer(articles, many=True).data,
                    headers={'Access-Control-Allow-Origin': '*'})

问题在于,15 分钟后,至少有一位用户需要等待 15 秒才能得到响应。我想在后台每 5 分钟预缓存一次,这样用户就不需要等待了。

我使用默认的缓存机制。

我的想法是创建一个management command,它将使用crontab 执行。每 5 分钟它会调用 Article.objects.home()ViewSet.action 并更改它在缓存中的值。

由于这只是一个条目,我毫不犹豫地使用了数据库缓存。

你会怎么做?

编辑:由于默认 LocMemCache 是单线程的,我将使用数据库缓存。我只是不知道如何手动缓存viewQuerySet

【问题讨论】:

    标签: python django caching django-rest-framework django-cache


    【解决方案1】:

    cron 或 Celery beat 任务(如果您已经使用 celery)看起来是最好的选择。

    除非您在管理器的 home() 方法中缓存(这可能是一个可以简化自动缓存刷新的有效选项),否则调用 Article.objects.home() 不会有太大作用。

    要自动刷新视图缓存,您最好从管理命令向 URL 发送实际请求。您还需要在发送请求之前使缓存无效,以便对其进行更新。

    另外,在规划作业频率时,请记住缓存超时。您不会想太早或太晚刷新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 2018-05-06
      • 2013-06-06
      相关资源
      最近更新 更多