我对heroku上的django应用程序的缓存和性能有疑问。
在我的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
缓存是解决您的问题的方法。仅通过缓存,您就可以轻松地满足90%以上的查询。
下一个问题是您在哪里缓存查询。
最快的是本地缓存。即在运行您的应用程序的同一台计算机上。这样做的主要缺点是在更新的情况下使高速缓存无效的复杂性。如果您的应用程序在10台服务器上运行,并且数据已在数据库中更新,则必须确保从所有服务器上清除了缓存,这会很麻烦。
因此,最好使用像Memcached或redis这样的集中式缓存服务器。还要确保缓存服务器与应用程序位于同一网络上。服务器之间的网络应尽可能快。
如果您认为缓存非常慢,请确保缓存可以正常工作。您创建的连接是单例连接。就像您在应用程序中一次创建连接一样。
希望这会有所帮助