【问题标题】:Django rest - understand cached resultsDjango rest - 了解缓存的结果
【发布时间】:2017-10-18 17:50:44
【问题描述】:

我的 Django restframework 项目中的查询速度很慢。

许多嵌套序列化程序导致 HTTP 请求缓慢(2-5 秒)

所以我考虑使用 Django 可以通过Memcache server 提供的缓存。

但恐怕我并不真正了解它的行为。如果客户端每 1 秒不停地请求相同的查询,突然其中一个对象发生了变化,会发生什么?用户会得到缓存的结果还是 Django 会返回带有特定更改的缓存结果?

【问题讨论】:

  • 在缓存之前首先优化您的端点。你优化你的数据库查询了吗?使用 Django 调试工具栏和.select_related('some_relation') 来减少数据库命中并加快您的端点。您还可以将序列化器拆分为列表序列化器(最小嵌套)和详细序列化器(所有需要的相关对象)。
  • 已经做到了。主列表项查询必须使用嵌套序列化程序进行详细说明:(
  • 那么django调试工具栏中没有重复查询?
  • 仍然,那里有作品。但我的主要问题是关于缓存。在我完成优化之后
  • 真的,使用缓存作为最后的手段。我从来不需要使用它,因为正确使用 select related 确实解决了我的慢端点问题。您还声称许多嵌套的序列化程序是必要的,但我不相信。批处理、多次调用、多个端点等是保持 api 快速的方法。是的,它需要在客户端做一些工作,但没有人或系统一直需要所有数据。

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


【解决方案1】:

Django 不会自动管理缓存数据。你必须自己管理它。

您可以采用多种方法来管理基于整个应用程序逻辑的缓存数据。

  • 您可以使用 django 信号来跟踪对象更改

https://docs.djangoproject.com/en/1.11/ref/signals/#module-django.db.models.signals

  • 您可以覆盖模型的保存和删除方法
def save(self, *args, **kwargs):
    super(MyModel, self).save(*args, **kwargs)
    cache.set(str(self.pk), pickle.dumps(self))
  • 您可以使用 DRF 的通用视图保存和删除挂钩:

perform_create、perform_update 和 perform_delete 方法

def perform_update(self, serializer):
    obj = serializer.save()
    cache.set(str(obj.pk), pickle.dumps(obj))

http://www.django-rest-framework.org/api-guide/generic-views/#genericapiview

对于基于 api 的应用,我更喜欢使用通用视图挂钩。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2016-02-23
    相关资源
    最近更新 更多