【发布时间】: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