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

Is there a faster approach than caching data between request? (heroku django app)

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

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

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

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

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

我尝试了 "MEMCACHED CLOUD" 和 "MemCachier"(两个 heroku 插件)。但是它们非常慢,当我在本地使用它们时也是如此(locmem:< 1 秒;memcached:> 5 秒)

问题:

谢谢!

#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

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

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

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

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

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

希望对您有所帮助