我想使用很棒的Cache Machine Django应用程序(https://github.com/jbalogh/django-cache-machine)在Heroku上使用Memcachier。
据我所知,由于Memcachier需要PyLibMC和SASL身份验证,所以Cache Machine无法使用Memcachie开箱即用(请参阅https://devcenter.heroku.com/articles/memcachier#django)。Cache Machine表示它支持PyLibMC,您所要做的就是将"cachech.backends.memcached.PyLibMCCache"放入CACHES设置中。
但是,当您这样做时,您会得到以下错误:"memcached_set:SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY"中的错误47
我认为原因是caching.backends.memcached.PyLibMCCache继承自django.core.cache.backends.mimcached.PyLibMC(请参阅https://github.com/jbalogh/django-cache-machine/blob/master/caching/backends/memcached.py),因为它应该从django_pylibc.memcached.PyLibMCCache继承,以便在Heroku上工作(但这有点像是在黑暗中拍摄)。
我制作了自己的自定义缓存后端,它继承了django_pylibc.memcached.PyLibMCCache,但现在当我检查我的Heroku Memcachier面板时,我所做的似乎并没有增加缓存——它一直保持在50mb,尽管我预计它会随着每个查询集的增加而增加。
有人成功地在Heroku上设置了缓存机吗?如果是,你会怎么做?
我使用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的需要。
希望这对杰克有所帮助!