在Heroku Memcachier上配置Django缓存机器



我想使用很棒的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的需要。

希望这对杰克有所帮助!

最新更新