« memcachedのflagsってのが何のためにあるのかっていう話 | メイン | cpanfileのrequiresにURLを直接指定するのは好ましくない »

2013年5月27日

Cache::Redisってのを書いたら意外と大変だった件

最近Redis使うのは当たり前で、開発とかテストでmemcachedすら立てるのめんどくさくて、なるべくRedisに寄せたいと思っている。

セッションストレージもRedisで良くねって思って、ArkだとCache::Cacheなインターフェースのモジュールがあれば簡単にセッションストレージを差し替えられるようになっているので、Cache::Redisってのを書いた。

先のエントリーでも書いたとおり データに対するメタ情報をRedisの場合もたせられないので、[$data, $flags] って データを作ってそれ毎まるっとシリアライズするという乱暴な作りになっている。

なので、ストアされているデータをredis-cliとかで読もうとしても読めないのが難点。

redis-cliで読めるように値をRedisのリスト型にして持たせることも検討したけど、普通に setする場合と比べて大分遅くなってしまったのでとりあえずやめた。

シリアライザにMessagePackも指定できるようにはしてあるけどStorableと比べて全 然速度差が出なかったり、今のところutf8決め打ちだったりするのでこの辺も変わりそう。

バックエンドは色々検討した末にRedis.pmになってる。再接続のケアとかがしっかりし てるのが現状の決め手。

Redis::hiredis使おうかと思って、いくつかp-rを送って取り込んでもらったりもしたんだけど、 いかんせん(当然ながら)プリミティブな実装なので、再接続とかその辺のケアをしてくれる ラッパーモジュールを書かないと厳しそう。

ただ、やっぱRedis::hiredisは大分高速で、単純に差し替えてベンチを取った場合、 3倍近く速くなる。そうなるとCache::Memcached::Fastには及ばないまでも遜色ない感 じにはなるので、出来れば差し替えたいなーとは思っている。

現状開発では使っているけど、実サービスでは使っていません。なのでインターフェース は変わらないと思うけど裏側は結構変わると思うので、使っている人がいたら注意して下さい。

フィードバックいただけると嬉しいです。

投稿者 Songmu : 2013年5月27日 00:47