我有一个数据库查询,在生产过程中需要几秒钟。我还有一个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
是单线程的,所以我将使用数据库缓存。我只是不知道如何手动缓存view
或QuerySet
cron或芹菜beat任务(如果您已经使用芹菜)看起来是最好的选择
除非缓存在管理器的
home()
方法中(这可能是一个可以简化自动缓存刷新的有效选项),否则调用Article.objects.home()
不会有多大作用要自动刷新视图缓存,最好从管理命令向URL发送实际请求。您还需要在发送请求之前使缓存失效,以便对其进行更新
此外,在规划作业频率时,请记住缓存超时。你不想刷新得太早也不想太晚
相关问题 更多 >
编程相关推荐