2010年11月29日月曜日

MongoDB その2

さて, redis のときと同じドメイン・クラスのインスタンスを, 同じように1万個作って, MongoDBに入れます.

一個ずつ flush:true すると34秒くらい, まとめて flush:true すると3秒くらい. こちらはまぁ, 許容範囲, というか Grails らしい遅さだ:-)

redis の場合に較べれば, とりあえずまともに動いているっぽい.

ただし, flush:true する前に永続化された (と思っている) インスタンスにアクセスしても (例えばfind) 答えは返ってきません...

とは言え, MongoDBだったら, 別に Grails のドメイン・クラスと inconsequential を経由するほどのことではない, という気もしないでもなかったりして(^_-)

2010年11月28日日曜日

MongoDB その1

どうも GORM for Redis の実装がうまくない, Spring 内の inconsequential がダメのような気がする, SpringSource から無用のプレッシャがあるんじゃないか...

と言うところで, 今度は GORM for MongoDB を試してみることにします.

まずは GORM for MongoDB のドキュメントを訳しましたよ.


なるほど, なるほど...

2010年11月20日土曜日

redis その4

GORM for Redis を使ってみたところ, 頭を傾げざるを得ない結果になってしまいました (redis その2).

そこで今度は Grails プラグインを経由せずに Groovy から直接 redis にアクセスしてみます.

とは言っても, redis のプロトコルをそのまま使うのは辛いので, GORM for Redis でも使われている Jedis (http://github.com/xetorthio/jedis) という Java クライアント API から使います.

ちなみに Jedis に Groovy 用に (とーっても) 薄い皮を被せた Gedis (http://github.com/xetorthio/gedis) と言うものもあるのですが, これは Jedis の最新 (1.4.x) でない版 (1.3.x) を要求するので止めておきます.

GORM for Redis と同じようにオブジェクト (Map) を Redis の hash, インデクスを Redis の set にマッピングしてみます.

public void testSomething() {

def redis = new Jedis('localhost')

assert redis

println redis.info()

redis.flushDB()

println redis.info()

def now = new Date()

println now

(0..9999).each { i ->

redis.hmset("jp.co.metabolics:redistest:Person:$i" as String,

[surname:"YAMADA$i" as String, forename:"Masaki$i" as String, dateOfBirth:now as String, gender:true as String])

redis.sadd("jp.co.metabolics:redistest:Person:id:$i" as String, "$i" as String)

redis.sadd("jp.co.metabolics:redistest:Person:surname:YAMADA$i" as String, "$i" as String)

redis.sadd("jp.co.metabolics:redistest:Person:forename:Masaki$i" as String, "$i" as String)

}

println new Date()

assert redis.exists('jp.co.metabolics:redistest:Person:8267')

assert redis.type('jp.co.metabolics:redistest:Person:8267') == 'hash'

assert redis.hget('jp.co.metabolics:redistest:Person:8267', 'surname') == 'YAMADA8267'

def i = redis.sinter('jp.co.metabolics:redistest:Person:surname:YAMADA8267')

assert i.contains('8267')

println new Date()

redis.save()

println new Date()

}


当然のことながら, 1万件の insert に対してほんの2秒ほど (GORM for Redisより二桁小さい) しか掛かりません...