読者です 読者をやめる 読者になる 読者になる

rediscoの利点と欠点と正しい使い方

はじめに
プロジェクトぽしゃって気力失ってたけど、どこかで誰かが使おうと思った時のために残しておく。

rediscoの使い方等は以下を参照
http://d.hatena.ne.jp/flag-boy/20110601/1306902308


rediscoの利点

1. Key-Valueじゃないデータ構造が扱いやすい
redisco とは RedisDjango モデルっぽく使えるようにしてくれるライブラリってだけあって、通常のKey-Valueじゃない構造が扱いやすくなっている。
特に、idを自動で振ってくれるのでkeyを自分で考える必要がない のは便利。

2. 検索がしやすい
普通のKey-Valueだとkeyが決まってないと値を取得出来ないため、条件に合うものを探し出すのとかは面倒。
その点rediscoはindexを張ってくれるので条件に合うものの取得が簡単。
複数の条件の組み合わせは不可だが、単一の条件であれば(例えば四角形の場合縦でも横でも)検索可能。


rediscoの欠点

遅い

当たり前っちゃ当たり前なんだけど、1つのモデルは複数のデータから出来ているので、その分遅い。
Djangoモデルと同じような感じで使おうとすると、redis使ってる意味ないじゃんってくらい遅くなる。
特にsave()が致命的に遅い。indexを更新してるからしょうがないんだけど。


rediscoの正しい使い方

indexの更新が重いならindexをなるべく張らないようにすれば何とかなるんじゃないかって?
そう思ってた時期が僕にもありました。
ところがそう単純ではなく、indexを張ってなくてもフィールドがあるだけで重くなる。
具体的にはindexを張ってないフィールドでもsave()一回につきwriteが2回走る。
結局軽くするにはフィールドを減らすしかないので、indexを張ってない(検索しない)フィールドはこんな風に1つにまとめる必要がある。

  • モデル定義
from redisco import models
class Animal(models.Model):                                                                                                                                                                                                                                                                                                                                                          
    animal_type = models.IntegerField(required=True)                                                                                                                                      
    area_id = models.IntegerField(required=True)                                                                                                                                            
    params_attr = redisco_models.Attribute(required=True,                                                                                                       
                                                                  default='', indexed=False)

params_attrはdictのpickleにして、検索しないものを全てここにまとめてある。
実際のプロダクションではsetterやgetter書いたりしてparams_attrの中をもっと使いやすくしてたけど、その辺は割愛。
こうすることでwriteの回数が減ってようやくマトモな速度で動くようになった。


まとめ
・redisを使って検索もしたいときとかは凄く便利
・というか他の用途で使うのはない
・使う場合は検索しないフィールドは極力減らす