2

Heroku で Memcachierを使用して、素晴らしい Cache Machine Django アプリ ( https://github.com/jbalogh/django-cache-machine ) を使用したいと思います。

私が理解していることから、Memcachier は PyLibMC と SASL 認証を必要とするため、Cache Machine はそのままでは Memcachier では機能しません ( https://devcenter.heroku.com/articles/memcachier#djangoを参照)。Cache Machine は、PyLibMC をサポートしていると述べています。必要なのは、「caching.backends.memcached.PyLibMCCache」を CACHES 設定にドロップすることだけです。

ただし、これを行うと、次のエラーが表示されます。

これの原因は caching.backends.memcached.PyLibMCCache が django.core.cache.backends.memcached.PyLibMC を継承しているためだと思いました ( https://github.com/jbalogh/django-cache-machine/blob/master/を参照) caching/backends/memcached.py )、Heroku で動作するために django_pylibmc.memcached.PyLibMCCache から継承する必要がある場所として (ただし、これは暗闇の中のショットのようなものです)。

代わりに django_pylibmc.memcached.PyLibMCCache から継承した独自のカスタム キャッシュ バックエンドを作成しましたが、Heroku Memcachier パネルを確認すると、何をしてもキャッシュが増加しているようには見えません。クエリセットごとに増加すると予想されます。

Heroku で Cache Machine を正常にセットアップした人はいますか? もしそうなら、どのようにしましたか?

4

1 に答える 1

3

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パッケージを使用することをお勧めしています。このパッケージも使用されますが、バイナリ プロトコルと認証の有効化をサポートするdjangopylibmc提供するものとは異なるキャッシュ インターフェイスを提供します。これについては、こちらのドキュメントで説明しています。

settings.pyMemCachier を使用して 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 に答える