我想在Heroku上使用Memcachier的真棒Cache Machine Django应用程序(https://github.com/jbalogh/django-cache-machine)。
根据我的理解,Cache Machine无法与Memcachier一起使用,因为Memcachier需要PyLibMC和SASL身份验证(请参阅https://devcenter.heroku.com/articles/memcachier#django)。 Cache Machine说它支持PyLibMC - 而你所要做的就是将“caching.backends.memcached.PyLibMCCache”放入CACHES设置。
但是,当你这样做时,你会收到这个错误:“来自memcached_set的错误47:服务器失败并且在重新计时之前被禁用”
我认为原因是caching.backends.memcached.PyLibMCCache继承自django.core.cache.backends.memcached.PyLibMC(请参阅https://github.com/jbalogh/django-cache-machine/blob/master/caching/backends/memcached.py),它应该从django_pylibmc.memcached继承。 PyLibMCCache为了在Heroku上工作(但这在黑暗中是一种镜头)。
我创建了自己的自定义缓存后端,而不是继承自django_pylibmc.memcached.PyLibMCCache,但是现在当我检查我的Heroku Memcachier面板时,似乎我没有做任何事情就是增加缓存 - 它停留在50 mb ,即使我希望它随着每个查询集而增加。
有没有人在Heroku上成功设置了Cache Machine?如果是这样,你怎么做的?
答案 0 :(得分:3)
我使用MemCachier。我们之前没有直接处理过Cache Machine,但我刚建了一个小应用,然后确认它在Heroku和MemCachier上工作正常。
快速背景,以防您对memcache和MemCachier不太熟悉。客户端和服务器之间有两种协商方式。一个是较早的ascii
协议,另一个是较新的binary
协议。我们MemCachier只支持binary
协议,因为它支持身份验证,而ascii
协议则不支持。{/ p>
您犯的错误是使用caching.backends.memcached.PyLibMCCache
作为缓存后端。虽然pylibmc
是我们推荐的内存缓存客户端,因为它支持binary
协议和sasl身份验证,但Django附带的缓存接口遗憾地不支持启用二进制协议。所以pylibmc简单地使用了它的默认值,即ascii
协议并失败。
您可以看到Django关于此问题的问题here。
因此,在MemCachier,我们一直建议您使用备用django-pylibmc-sasl
包。此程序包也使用pylibmc
,但提供了与django提供的不同的缓存接口,支持支持启用二进制协议和身份验证。我们的文档here中讨论了这一点。
以下是我通常在settings.py
中使用MemCachier配置Django缓存的代码:'
## MemCachier Settings
## ===================
def get_cache():
# We do this complicated cache defenition so that on a local machine (where
# MEMCACHIER_SERVERS won't be defined), the try fails and so we use the
# inbuilt local memory cache of django.
try:
os.environ['MEMCACHE_SERVERS'] = os.environ['MEMCACHIER_SERVERS'].replace(',', ';')
os.environ['MEMCACHE_USERNAME'] = os.environ['MEMCACHIER_USERNAME']
os.environ['MEMCACHE_PASSWORD'] = os.environ['MEMCACHIER_PASSWORD']
return {
'default': {
'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
'TIMEOUT': None,
'BINARY': True,
'OPTIONS': {
'tcp_nodelay': True,
'no_block': True,
'tcp_keepalive': True,
'_poll_timeout': 2000,
'ketama': True,
'connect_timeout': 2000,
'remove_failed': 4,
'retry_timeout': 2,
'dead_timeout': 10
}
}
}
except:
# Use django local development cache (for local development).
return {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'
}
}
CACHES = get_cache()
这也将使您在本地计算机上的开发变得简单,因为当MEMCACHIER_SERVERS
未定义时,它将回退到django的简单本地堆缓存,从而无需在本地安装memcache。
希望这有助于杰克!