mrubyでRedisを操作するmruby-redis書いたよー

mrubyでRedisを操作できるようにしました。ソースはGitHubに上げています。driverにはhiredisを使っているので結構高速だと思います。

元々のモチベーションはmod_mrubyでredisを操ることでしたが、mrubyのような軽量・高速な言語とRedisの連携は実に相性が良いと思ったので、mrubyの拡張ライブラリとして書き直しました。

色々と考えがあってmrbgems化はもう少ししてからにしようと思っています。

インストール

非常に簡単です。以下の通りです。自動で最新のmrubyも取得します。

[program lang=’bash’ escaped=’true’]

git clone git://github.com/matsumoto-r/mruby-redis.git
cd mruby-redis
make
cd example
make
./tester redis.rb

[/program]

使い方

example以下にmruby実行バイナリをtesterとして準備している(mrubyにmruby-redisリンクしたバイナリ)ので、これで最初は試すと良いと思います。また、mrubyのアプリケーション組み込みのサンプルにもなると思います。

コードのサンプルは以下です。

[program lang=’ruby’ escaped=’true’]

host    = "127.0.0.1"
port    = 6379
key     = "hoge"

puts "> redis connect #{host}: #{port.to_s}"
r = Redis.new host, port

puts "> redis set #{key} 200"
r.set key, "200"

puts "> redis get #{key}"
puts "#{key}: #{r[key]}"

puts "> redis set #{key} fuga"
r[key] =  "fuga"

puts "> redis get #{key}"
puts "#{key}: #{r.get key}"

puts "> redis del #{key}"
r.del key

if r[key].nil?
    puts "del success!"
end

puts "> redis incr #{key}"
puts "#{key} incr: #{r.incr(key)}"
puts "#{key} incr: #{r.incr(key)}"
puts "#{key} incr: #{r.incr(key)}"
puts "#{key} incr: #{r.incr(key)}"

puts "> redis decr #{key}"
puts "#{key} decr: #{r.decr(key)}"
puts "#{key} decr: #{r.decr(key)}"
puts "#{key} decr: #{r.decr(key)}"
puts "#{key} decr: #{r.decr(key)}"

puts "> redis lpush logs error"
r.lpush "logs", "error1"
r.lpush "logs", "error2"
r.lpush "logs", "error3"

puts "> redis lrange 0 -1"
puts r.lrange "logs", 0, -1

puts "> redis ltrim 1 -1"
r.ltrim "logs", 1, -1

puts "> redis lrange 0 -1"
puts r.lrange "logs", 0, -1

puts "> redis del logs"
r.del "logs"

if r["logs"].nil?
    puts "del success!"
end

puts "> redis publish :one hello"
r.publish "one", "hello"

r.close

[/program]

Redisを起動した状態で実行すると、以下のように実行結果が得られます。keyやValueのsetやgetは、setメソッドでも[]メソッドでも使えるようにしています。インクリメントやデクリメント、リスト操作もできるようにしました。

[program lang=’text’ escaped=’true’]

> redis connect 127.0.0.1:6379
> redis set hoge 200
> redis get hoge
hoge: 200
> redis set hoge fuga
> redis get hoge
hoge: fuga
> redis del hoge
del success!
> redis incr hoge
hoge incr: 1
hoge incr: 2
hoge incr: 3
hoge incr: 4
> redis decr hoge
hoge decr: 3
hoge decr: 2
hoge decr: 1
hoge decr: 0
> redis lpush logs error
> redis lrange 0 -1
["error3", "error2", "error1"]
> redis ltrim 1 -1
> redis lrange 0 -1
["error2", "error1"]
> redis del logs
del success!
> redis publish :one hello

[/program]

できるだけ、redis-rbにインターフェイスを合わせていますが、mrubyの良さを生かすために機能は今の所最小限にしています。

今後はsubscribeやasync等も実装する予定ですが、もちろんpull-requestもお待ちしております!