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もお待ちしております!