2010年9月12日日曜日

redis その2

さて, 淡々といきますよ.

redis本体をダウンロード, $make; $make test します.

Grailsプロジェクトを作り, GORM for redisプラグインをインストールします.

maven経由でいろいろなjarが付いてきます.
  • grails-datastore-gorm-redis-1.0.0.M1.jar
  • grails-datastore-gorm-1.0.0.M1.jar
  • spring-datastore-web-1.0.0.M1.jar
  • spring-datastore-core-1.0.0.M1.jar
  • spring-datastore-redis-1.0.0.M1.jar
  • jedis-1.0.0-RC4.jar
最後のjedisは, Javaのredisクライアントですが, その他はバージョン番号から見て, このGORM for redisの一味 (inconsequentialってやつですかい?) のようです.

さて, 何はともあれ, redisにつなぐGrailsアプリケーションを作ってみます. 取りあえず, grails側, redis側共にいっさい手は入れず, デフォルトのまま, grailsのintegration testを動かすことにします.

redisは $ ./redis-server で走り始めます. 5秒ごとのハートビートが鬱陶しいですが, 動かし始めると最初は役に立ちます.

ドメイン・クラスはこんな単純なもの. 関連も何も持ちませんが, 姓, 名についてインデクスを貼ってみました.

class Person {
static mapWith = "redis"
String surname
String surnameKana
String forename
String forenameKana
Date dateOfBirth
Boolean gender

static mapping = {
surname index:true
forename index:true
}
}

見て分かるとおり, Hibernateと共存した上で, このドメイン・クラスについてはredisを使うようにしています.

さて, 適当に1万件ほど作って, save()してみましょう. 20秒ほどで終了. なるほど.

と思いきや, この後に count()しようとすると, その時点で200秒 (!!) ほど待たされます. その間, redis側ではせっせとファイルに書き込んでいるようです. (redisではない) どこかにキャッシュされていただけなのですかね.

最初から1万件を一件ごとに save(flush:true) してみると, 230秒. だいたい理屈は合ってます:-) ちなみにこの時点でDBファイルの大きさは3MBほどになっています.

うーん. じゃあ今度は同様に10万件ほど書き込んでみると...

... 何時間か動いた挙げ句落ちました orz

そろそろ, 自分の手が何をやっているか, 頭が理解していないとやばい気がしてきました. GORM for redisにもまだまずいところはありそうですが, まずはredisについてもう少し掘ってみましょうか...