在Heroku Memcachier上配置Django缓存计算机?

在Heroku Memcachier上配置Django缓存计算机?,django,heroku,memcached,django-cache-machine,Django,Heroku,Memcached,Django Cache Machine,我想在Heroku上使用Memcachier来使用很棒的缓存机器Django app() 据我所知,缓存机器不能与Memcachier一起开箱即用,因为Memcachier需要PyLibMC和SASL身份验证(请参阅)。Cache Machine表示它支持PyLibMC——您所要做的就是将“caching.backends.memcached.Pylibmcache”添加到缓存设置中 但当您执行此操作时,会出现以下错误:“memcached_set中的错误47:服务器已失败,并且在定时重试之前处

我想在Heroku上使用Memcachier来使用很棒的缓存机器Django app()

据我所知,缓存机器不能与Memcachier一起开箱即用,因为Memcachier需要PyLibMC和SASL身份验证(请参阅)。Cache Machine表示它支持PyLibMC——您所要做的就是将“caching.backends.memcached.Pylibmcache”添加到缓存设置中

但当您执行此操作时,会出现以下错误:“memcached_set中的错误47:服务器已失败,并且在定时重试之前处于禁用状态”

我认为造成这种情况的原因是caching.backends.memcached.pylibmcache继承自django.core.cache.backends.memcached.PyLibMC(请参阅),因为它应该继承自django_PyLibMC.memcached.pylibmcache,以便在Heroku上工作(但这有点像是在黑暗中拍摄)

我创建了自己的自定义缓存后端,而不是从django_pylibmc.memcached.Pylibmcache继承而来,但是现在当我检查我的Heroku Memcacheer面板时,似乎我所做的任何事情都没有增加缓存——它被固定在50MB,尽管我希望它会随着每个查询集的增加而增加


有人在Heroku上成功设置了缓存计算机吗?如果是这样,你是怎么做到的?

我和MemCachier一起工作。我们以前没有直接处理过缓存机器,但我只是构建了一个小应用程序,然后确认它在Heroku和MemCachier上运行良好

如果您对memcache和MemCachier不太熟悉,请提供快速的背景知识。客户机和服务器之间有两种通信协议。一个是较旧的
ascii
协议,另一个是较新的
binary
协议。我们MemCachier只支持
二进制
协议,因为它支持身份验证,而
ascii
协议不支持身份验证

您所犯的错误是使用
caching.backends.memcached.pylibmcache
作为缓存后端。虽然
pylibmc
是我们推荐的memcache客户端,因为它支持
binary
协议和sasl身份验证,但Django附带的缓存接口不支持启用binary协议。因此,pylibmc只是使用默认值,即
ascii
协议,但失败了

你可以看到关于这个问题的Django的票

因此,在MemCachier,我们一直建议您使用替代的
django pylibmc sasl
软件包。该软件包也使用
pylibmc
,但提供了不同于django提供的缓存接口,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\u服务器时,它将退回到django的简单本地堆缓存,从而避免您在本地安装memcache


希望这对杰克有帮助

非常感谢您指出问题所在,并将get_cache函数组合在一起。唯一的问题是(我认为)对于像Cache Machine这样的东西,您需要使用以“caching.backends…”开头的自定义缓存后端。我想知道是否需要定义自己的后端来利用SASL?你对如何开始有什么建议吗?是不是“思考”意味着你尝试了上面的方法,但失败了?或者这是一个假设?若缓存机器有这样的限制,我会非常惊讶,它这样做并没有任何意义。另外,在我的测试中,我让缓存机器使用上述方法。因此,如果您的不工作,请您张贴错误,以便我可以进一步诊断。感谢您再次联系。当我尝试您的解决方案时(这类似于我在发布SO之前第一次尝试的方法,现在也再次尝试),我没有收到任何错误。然而,我认为它不起作用,因为我的Memcachier仪表板根本没有显示“当前使用情况”或“键数”在我预期的情况下增加。(当我将“caching.backends.memcached.memcached”后端与Elasticache/我自己的缓存服务器一起使用时,该站点的使用会导致缓存使用率的增加,正如预期的那样。)我还没有深入研究缓存机源代码(我不确定我是否有足够的程序员来这样做),但我的理解是,他们已经编写了定制的memcached后端(即“后端”设置中的内容),使用其中一个后端是它工作所必需的。但是,至少到目前为止,我认为他们的任何后端都不能与SASL一起工作——而且我也不确定是否有一个简单的解决方案。Jake,我针对MemCachier本身测试了这个解决方案,所以我知道它可以与SASL身份验证一起工作。我很有信心,一定是出了什么问题。这可能只是因为我们的仪表盘没有按预期工作,使您相信缓存在正常工作时没有工作。这很少见,但有时我们的仪表板会认为您使用的是与实际不同的群集,因此不会显示缓存使用情况。