在Heroku Memcachier上配置Django Cache Machine?

时间:2013-07-15 20:20:54

标签: django heroku memcached django-cache-machine

我想在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?如果是这样,你怎么做的?

1 个答案:

答案 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。

希望这有助于杰克!