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より二桁小さい) しか掛かりません...