2

我想在 Heroku 上使用 Memcachier来使用很棒的 Cache Machine Django 应用程序( https://github.com/jbalogh/django-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/ cache/backends/memcached.py),因为它应该从 django_pylibmc.memcached.PyLibMCCache 继承以便在 Heroku 上工作(但这有点像在黑暗中拍摄)。

我制作了自己的自定义缓存后端,该后端继承自 django_pylibmc.memcached.PyLibMCCache,但是现在当我检查 Heroku Memcachier 面板时,似乎我所做的任何事情都没有增加缓存——即使它停留在 50 mb我希望它会随着每个查询集而增加。

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

4

1 回答 1

3

我与 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。

希望这可以帮助杰克!

于 2013-07-16T22:26:17.957 回答