RMapperというgemを書いた

大雑把にいうとKVS(Redis)で複数カラムのデータを扱えるようにするgemである。
GitHubで公開中
RMapper

動機

このgemを書いたのは自分の開発で

  • レコードを検索するのに一つのキーしか使わない。
  • でも複数のカラムを持つ。
  • スキーマが変更されやすい。
  • データの参照がメイン

という状況があったからだ。

RDBだとスキーマの変更がしにくい。だからRDBはあんまり使いたくない。
何より、レコードの検索に一つのキーしか使わないのにKVSを使わないのは勿体無いじゃない。
あと、個人的にRedisの扱いやすさが好きでRedisを使いたかったということもある。

使い方

以下のようにして使う。(事前にResisのサーバーを立ち上げて置かなければならない。)

require "rmapper"

class Person < RMapper::Base
  @host = "127.0.0.1"
  @port = 6379
  @db = 1
end

Person.establish_connection # redis-serverとコネクションをはる

yktwww = Person.create!("yktwww") 
yktwww.set("age", 25)
yktwww.set("sex", "male")
yktwww.set("languages", ["Ruby", "Java", "Python"])
yktwww.save # メモリ上にデータを保存

Person.dump # メモリ上のデータをディスクに保存


yktwww = Person.find("yktwww")
yktwww.get("age") #=> 25
yktwww.get("sex") #=> "male"
yktwww.get("language") #=> ["Ruby", "Java", "Python"]

インスタンス生成にはfind(key)create!(key)find_or_create(key)の3つのクラスメソッドがある。
find(key)はDB中にkeyをキーとするデータが存在したらそれを返し、存在しなかったらnilを返す。
create!(key)はDB中にkeyをキーとするデータが存在するかどうかに関係なく新しいデータを作成する。
find_or_create(key)は存在すればそのデータを返し、存在しなければ新しくデータを作成する。

しくみ

Rubyのオブジェクト(数値、文字列、ハッシュ、配列、真偽値、nil等)をMessagePackで直列化し、直列化したバイナリ文字列をRedisに保存するということをやっている。
たいして難しいことはやっていない。
MessagePackを使ってる関係上、一般的ではない複雑なクラスのオブジェクトをsetすることはできない。(MessagePackがサポートしているオブジェクトしか扱えない。)

おわりに

gemをちゃんと(?)作ったのは初めてで、まだちゃんとしてない部分がありそうで恐い。
READMEを書かないと。テストも書かなくちゃ。
はやくgemとして公開したい。