【问题标题】:Is there a faster approach than caching data between request? (heroku django app)有没有比在请求之间缓存数据更快的方法? (heroku django 应用程序)
【发布时间】:2020-10-02 12:11:22
【问题描述】:

我对 heroku 上的 django 应用程序的缓存和性能有疑问。

  • django 2.2.9
  • python 3.7

在我的 django-app 中,我使用不同的 ajax 请求,它们使用相同的查询集(第一个请求是根据过滤器集的结果数,然后它请求一个表,然后是图片)。

出于性能原因,我在服务器端使用缓存,而不是每次都查询数据库。

在开发中我使用了 Django 的 LocMemCache,真的是又快又方便。

在 heroku 上它真的很慢(我不知道为什么)。所以我改成了 django 和 heroku 推荐的 memcached。

我尝试了“MEMCACHED CLOUD”和“MemCachier”(都是 heroku 插件)。但是它们非常慢,当我在本地使用它们时也是如此(locmem: 5sec)

问题

  • 我应该使用不同的方法而不是缓存吗? (我想到了会话,但我无法存储查询集。而且我不确定它是否真的更快,因为它保存在数据库或缓存中)

  • 如果缓存是正确的方法。如何加快速度?

谢谢!

#settings
CACHES = {

    'default': {
        'BACKEND': 'django_bmemcached.memcached.BMemcached',
        'TIMEOUT': 60 * 60,
        'LOCATION': os.environ['MEMCACHEDCLOUD_SERVERS'].split(','),
        'OPTIONS': {
            'username': os.environ['MEMCACHEDCLOUD_USERNAME'],
            'password': os.environ['MEMCACHEDCLOUD_PASSWORD'],
        }
    },
    'local': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'
    }
}

在缓存中


#caching

from django.core.cache import caches
from models import ImpactEvent
from datetime import datetime

cache_l = caches['local']
cache = caches['default']


qa = ImpactEvent.objects.all()

#queryset evaluated on purpose
cnt_ies = len(qa)
share_d = {
        'q_ie': qa,
        'cnt_ies': cnt_ies, #are 200 entries
    }

def get_cache_test(name):
    start = datetime.now()
    cache.get(name)
    print('cache get', datetime.now() - start)
    start = datetime.now()
    cache_l.get(name)
    print('cache get_l', datetime.now() - start)

def set_cache_test(name, value):
    start = datetime.now()
    cache.set(name, value)
    print('cache set', datetime.now() - start)
    start = datetime.now()
    cache_l.set(name, value)
    print('cache set_l', datetime.now() - start)

性能结果

# results
set_cache_test('string', 'value')
cache set 0:00:01.070784
cache set_l 0:00:00.000089

get_cache_test('string')
cache get 0:00:00.282374
cache get_l 0:00:00.000109

#dictionary with queryset
set_cache_test('share_d', share_d)
cache set 0:00:09.692612
cache set_l 0:00:00.044507

get_cache_test('share_d')
cache get 0:00:00.221846
cache get_l 0:00:00.052196

【问题讨论】:

    标签: django heroku caching memcached


    【解决方案1】:

    缓存是您的问题的解决方案。仅通过缓存,您就可以轻松地处理 90% 以上的查询。

    下一个问题是你在哪里缓存你的查询。

    最快的是本地缓存。即在您的应用程序运行的同一台机器上。这样做的主要缺点是在更新时使缓存无效所涉及的复杂性。如果您的应用程序在 10 台服务器上运行,并且数据库中的数据得到更新,则您必须确保从所有服务器中清除缓存,这将是一件痛苦的事情。

    所以最好有一个像 Memcached 或 redis 这样的集中式缓存服务器。还要确保缓存服务器与您的应用程序位于同一网络上。服务器之间的网络应该尽可能快。

    如果您认为您的缓存非常慢,请确保您的缓存正常工作。您正在创建的连接是单例连接。就像您在应用程序中创建一次连接一样。

    希望对你有帮助

    【讨论】:

    • 谢谢您!是的,我的缓存很慢(memcached 为 9.6 秒,而 LocMem 缓存为 0.04 秒,我无法在生产中使用)。如何改进我的缓存?我没有找到有关 memcached 或 memcached 云(这是我在 heroku 上使用的服务)的可用信息。谢谢!
    • memcached 在哪里以及如何托管?
    • 我在 heroku 上添加了插件“MemcachedCloud”。我有 30MB 内存和 1 个名为 Memcached Cloud/AWS/us-east-1/30MB 的专用数据库的免费计划。 redislabs.com/lp/memcached-cloud 抱歉,我对缓存不太了解。您需要哪些信息?谢谢
    • 主要是设置缓存比较慢(约10秒),但获取缓存值(0.1秒)却相当快
    • Ok..确保缓存服务器与您的应用程序服务器位于同一区域。 (假设您的应用程序也托管在 AWS 上)。如果您的写入时间很长,是否包括数据库时间。如果不是,那么我会检查您存储的对象是否很大(超过 2-3 MB)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多