djangoのキャッシュバックエンドとして、Redisを使ってみたけど、慣れてないし、しばらくしたらメモリを圧迫したせいかdjangoがタイムアウトを連発しだしたので、こりゃだめだと思い、groongaを試してみた流れを書いておく。groongaは全文検索エンジンだけど、kvsみたいな使い方も出来る。詳しくはgroongaのページを読めば分かる、はず。

groonga側の設定

どうもMemcachedバイナリプロトコルが使えるらしい。マニュアルのページからおもむろに

$ groonga -d --protocol memcached hoge

とやるとhogeというファイルが出来た(hogeがデータベース名かつファイル名)。んで、

$ groonga -c
> table_list

とするとテーブルが無い。出来てない。これじゃアクセス出来ないんじゃね?と思い(間違ってたんだけど)ググると固定のテーブル名、カラム名になってうんたらかんたらと書いていた。

そこで「決まった名前でテーブルを手動で作らないといけない」と思い込み、指定するべきテーブル名をググってBingして探して1時間以上、ソースからやっとテーブル名がMemcacheで・・・と分かった時点でテーブル、カラムはgroonga側で自動で作成することに気づいた。どうもバイナリプロトコルでアクセスがあった瞬間にテーブル、カラムを作るみたい。なので、上のコマンドだけで良かったみたい。えーそうなのー><。こんな簡単なのになんでハマったのか・・・><

ちなみにこのコマンドの場合、ポートは10041となる。

django側の設定

groonga側の設定でハマった理由はdjangoのキャッシュフレームワークでdjango.core.cache.backends.memcached.MemcachedCacheを使うと全然キャッシュしてくれなかったことにある。

このライブラリがバイナリプロトコルを使っていないというのに全く気付かず、絶対groonga側でテーブル作ってないからだと勘違いして1時間以上無駄にしてしまった。

で、結論としてはDjango-BMemcachedを使えば問題なくキャッシュしてくれる。他にもバイナリプロトコルを使うライブラリにdjango-pylibmcがあるけど、これは何故か接続の段階で止まってしまった。

手順としてはこんな感じ

$ sudo aptitude install libmemcached-dev
$ pip install django-bmemcached

aptitudeの部分は要らないかも(django-pylibmcを入れる時に怒られて入れたので、もしかして必要無いかもしれない)

# settings.py
CACHES = {
    'default':{
        'BACKEND':'django_bmemcached.memcached.BMemcached',
        'LOCATION': ['127.0.0.1:10041'],
    }
}

これはローカルで上のような形でgroongaのサーバを作った場合の設定。 これで普通のキャッシュを扱うプログラム書けばちゃんとデータをgroongaに入れてくれた。

めでたしめでたし。