是否有比在请求之间缓存数据更快的方法? (heroku django应用)

问题描述 投票:0回答:1

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

  • django 2.2.9
  • python 3.7

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

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

在开发中,我使用了Django的LocMemCache,它确实非常快捷方便。

在heroku上,它确实很慢(我实际上不知道为什么)。所以我改为django和heroku推荐的memcached。

我尝试了“ MEMCACHED CLOUD”和“ MemCachier”(均为heroku插件)。但是它们非常慢,而且在本地使用时也是如此(locmem:<1秒; memcached:> 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个回答
0
投票

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

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

最快的是本地缓存。即在运行您的应用程序的同一台计算机上。这样做的主要缺点是在更新的情况下使高速缓存无效的复杂性。如果您的应用程序在10台服务器上运行,并且数据已在数据库中更新,则必须确保从所有服务器上清除了缓存,这会很麻烦。

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

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

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.