我与 MemCachier 一起工作。我们之前没有直接处理过 Cache Machine,但我只是构建了一个小应用程序,然后确认它在 Heroku 和 MemCachier 上运行良好。
如果您对 memcache 和 MemCachier 不太熟悉,请提供快速背景知识。客户端和服务器之间有两种通信协议。一种是较旧的ascii协议,另一种是较新的binary协议。我们 MemCachier 仅支持该binary协议,因为它支持身份验证,而该ascii协议不支持。
您犯的错误是caching.backends.memcached.PyLibMCCache用作缓存后端。虽然pylibmc是我们推荐的 memcache 客户端,因为它支持binary协议和 sasl 身份验证,但遗憾的是 Django 附带的缓存接口不支持启用二进制协议。所以 pylibmc 只是使用它的默认值,即ascii协议并且失败。
您可以在此处查看 Django 关于此问题的票证。
因此,在 MemCachier,我们一直建议您使用替代django-pylibmc-sasl包。这个包也被使用pylibmc,但提供了一个与 django 提供的不同的缓存接口,它支持启用二进制协议和身份验证。我们在此处的文档中对此进行了讨论。
下面是我通常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。
希望这可以帮助杰克!