• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

redis とは

インストール

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 時に集合型を参照するとエラー

など使い辛い

posted by maiha maiha on Mon 22 Feb 2010 at 07:04 with 0 comments
Contents rssrss
Ubuntu 10.04 (lucid) でSunJDKを使う方法
Hashname: 大量のファイルをScalaで楽に扱う方法
公開した gem を削除する方法
thor で usage の自動生成
[NoSQL] ohm-arfreaks (redis用のAR風ORM) の使い方
rubygems-1.3.6 を入れてしまうと rails-2.2.2 が全滅する件
[NoSQL] activetokyocabinet (TokyoTyrantのORM) の使い方
[NoSQL] MiyazakiResistance (TokyoTyrantのORM) の使い方
[NoSQL] rufus-tokyo (TokyoCabinetのORM) の使い方
[NoSQL] Ohm (redis用のORM) の使い方
Tags
NoSQLKVSTokyoCabinetOhmredisrubygemstokyotyrantActiveRecordjavarailsRubyistScalaSunJDKthorubuntu
Comments rssrss
maiha maiha: 追記)対応は約1営業日でした。チームの忙しさに応じて変動するとは思いますが、大体の目安情報ということ... 04/19 07:39
maiha maiha: なるほど。rails のログから実行したクエリを抜き出したいと思うことがよくありまして。 あ、削除... 03/08 04:15
winebarrel winebarrel: レポートありがとうございます。 削除できない件は修正しました。 SQLのparserはTC/TTに... 02/27 04:40
maiha maiha: なるほど。ありがとうございます! 02/08 18:19
ursm ursm: Haml 2.2 以降はどこでも式展開が使えるようになったので、== は意味がなくなりました。! だ... 02/08 10:23
walf443 walf443: それgit remote -vでできるよ 01/18 02:10
maiha maiha: reset だと範囲が tree 全体になるよね?例えば 「lib/* 以下は正しく修正できていて ... 08/29 21:32
Leonard Chin (レオ) Leonard Chin (レオ): git reset --hard でいいんじゃない? 08/28 12:32