【问题标题】:External-API call caching in DjangoDjango 中的外部 API 调用缓存
【发布时间】:2015-03-29 09:06:06
【问题描述】:

我正在开发一个 Django 应用程序,用于从 YQL 检索一些信息 - 总共 - 主页本身有大约 5 个请求,其中 1 个是实时请求,其他是过去的数据请求 - 所以加载需要很长时间.
API 调用的响应没有存储在我的数据库中,只是显示出来。 我想通过缓存来优化过去的数据获取部分,因此需要一些关于如何做同样事情的指导。

提前致谢。

【问题讨论】:

  • 信息不足。例如,数据是用户特定的吗?还是对所有用户都一样?它需要多久更新一次?等等。
  • @rnevius 所以数据是公开的——不是用户特定的。它基本上是一场板球比赛的实时比分,每 2 分钟更新一次,还提供过去 3 场比赛的数据。因此,一旦正在进行的比赛结束,它就会成为过去 3 场比赛的一部分。您还需要更多信息吗?

标签: python django caching optimization yql


【解决方案1】:

嗯,首先,你的问题很糟糕,因为你没有具体说明你尝试了什么。但是缓存您将要显示的外部调用是个好主意。

Django docs have a very clear 说明如何设置缓存。 一旦你设置好了(Db 缓存对于本地主机来说是最简单的,根据我的经验,memcached 用于任何接近生产的东西):

添加到 settings.py:

    CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
    }
}

如果您使用 DatabaseCache 选项,请确保此时同步数据库。

现在,如果我们假设您有类似的 API 调用:

scraped_data = external_api_call()

那么你可以这样做:

from django.core.cache import cache
cache_key = "match1"
cache.set(cache_key, scraped_data, None)

我已将其分解为额外的步骤,并且通常不会单独定义 cache_key!最后的“无”将其设置为永不过期-您可以在其中设置自己的到期时间,以秒为单位。

如果您要动态定义缓存键,则可能执行以下操作:

from hashlib import sha256
from django.core.cache import cache
cache_key = sha256(str(variable1)+str(variable2)) 
cache.set(cache_key, stuff_stored, None) 

要从缓存中取回该信息,您只需执行以下操作:

stuff_i_want = cache.get(cache_key) 

同样,如果你想删除缓存项,只需:

cache.delete(cache_key)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 2018-05-24
    • 2014-02-03
    • 1970-01-01
    • 2016-11-14
    • 2019-02-01
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多