[NoSQL] Ohm (redis用のORM) の使い方
redis とは
- Cで書かれた超高速なKVS
- オンメモリなので超高速 (約10万件操作/秒 @Xeon 2.5Ghz)
- 定期的に自動保存する永続化機能 (memcached に対する利点)
- 文字列以外にも集合型を扱える (TokyoCabinet に対する利点)
- 公式 http://code.google.com/p/redis/
- ベンチ http://code.google.com/p/redis/wiki/Benchmarks
インストール
shell>>
% gem install ohm
<<--
セットアップ
ruby>>
require 'ohm'
Ohm.connect(:port=>6379)
<<--
モデル
ruby>>
class Video < Ohm::Model
attribute :url
attribute :created_at
set :tags
index :url # 検索対象には全てindexを作成する
index :tags # 検索対象には全てindexを作成する
end
<<--
- pkeyのidが勝手に定義される
- redisで利用可能なvalueの型は、文字列と集合
- Ohmでは文字列型を attribute で定義する
- Ohmでは集合型を set で定義する
- Ohmではさらに独自の list(順序付き集合), counter(増減のみ操作可能な数値) 型が利用可能
使用例
ruby>>
video = Video.new(:url=>"http://www.you...", :tags=>"愛理")
video.save
video.tags << "cute"
Video.find(:tags=>"cute")
=> #<Index: ["1", "2"]>
Video.find(:tags=>"cute").last.tags
=> #<Set: ["cute", "愛理"]>
<<--
低レベルAPI
Object-Hash ではなく、純粋に redis の KVS 用 API として利用する場合。
ruby>>
Ohm.redis.get "Foo" # => nil
Ohm.redis.set "Foo", "xxx" # => "OK"
Ohm.redis.get "Foo" # => "xxx"
<<--
長所
- redisのKVS性能が高いので単純レコードへの参照・記録は超高速
- 集合型を持つのでタグの扱いなどが凄く便利
- スキーマレスでとっつきやすい
- 各操作がアトミックなのでロックがない
短所(redis)
- 文字列型のみ(数値や日付を入れても範囲検索できないので実用的ではない)
- 検索機能が貧弱 (文字列の完全一致のみ)
- データ保存が async
- もちろんトランザクション処理もなし
保存時間の間隔を設定できるとは言え、基本 async なのでクラッシュによるデータ損失の危険性が常にある。
その意味では、RDBのようなしっかりとしたデータストレージでなく、
前回の状態を(運が良ければ)そのまま再開してくれる memcached
という認識(利用)がよさそう。
短所(Ohm)
- 予約語チェックがなく、id 属性を指定すると謎の挙動でハマる
- new record 時に集合型を参照するとエラー
など使い辛い