MemCachier を使用しています。これまで Cache Machine を直接扱ったことはありませんでしたが、Heroku と MemCachier で正常に動作することを確認するために小さなアプリを作成しました。
memcache と MemCachier にあまり慣れていない場合に備えて、背景を簡単に説明します。クライアントとサーバー間の通信には 2 つのプロトコルがあります。1 つは古いascii
プロトコルで、もう 1 つは新しいbinary
プロトコルです。MemCachier ではbinary
、プロトコルは認証をサポートしていませんが、認証をサポートしているため、プロトコルのみをサポートしascii
ています。
あなたが犯している間違いはcaching.backends.memcached.PyLibMCCache
、キャッシュバックエンドとして使用しています。pylibmc
プロトコルと sasl 認証をサポートしているため推奨される memcache クライアントですが、残念ながらDjango に付属のキャッシュ インターフェイスはバイナリ プロトコルの有効binary
化をサポートしていません。したがって、pylibmc は単純にデフォルトのプロトコルを使用し、失敗します。ascii
この問題に関する Django のチケットはこちらで確認できます。
そのため、MemCachier では常に代替django-pylibmc-sasl
パッケージを使用することをお勧めしています。このパッケージも使用されますが、バイナリ プロトコルと認証の有効化をサポートするdjangoがpylibmc
提供するものとは異なるキャッシュ インターフェイスを提供します。これについては、こちらのドキュメントで説明しています。
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 をローカルにインストールする必要がなくなります。
これがジェイクに役立つことを願っています!