mrubyでRedisを操作できるようにしました。ソースはGitHubに上げています。driverにはhiredisを使っているので結構高速だと思います。
元々のモチベーションはmod_mrubyでredisを操ることでしたが、mrubyのような軽量・高速な言語とRedisの連携は実に相性が良いと思ったので、mrubyの拡張ライブラリとして書き直しました。
色々と考えがあってmrbgems化はもう少ししてからにしようと思っています。
インストール
非常に簡単です。以下の通りです。自動で最新のmrubyも取得します。
git clone git://github.com/matsumoto-r/mruby-redis.git
cd mruby-redis
make
cd example
make
./tester redis.rb
cd mruby-redis
make
cd example
make
./tester redis.rb
使い方
example以下にmruby実行バイナリをtesterとして準備している(mrubyにmruby-redisリンクしたバイナリ)ので、これで最初は試すと良いと思います。また、mrubyのアプリケーション組み込みのサンプルにもなると思います。
コードのサンプルは以下です。
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
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
Redisを起動した状態で実行すると、以下のように実行結果が得られます。keyやValueのsetやgetは、setメソッドでも[]メソッドでも使えるようにしています。インクリメントやデクリメント、リスト操作もできるようにしました。
> 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
> 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
できるだけ、redis-rbにインターフェイスを合わせていますが、mrubyの良さを生かすために機能は今の所最小限にしています。
今後はsubscribeやasync等も実装する予定ですが、もちろんpull-requestもお待ちしております!
0 Comments.