What is it, naokirin?

Redis for Java

Redisについてですが、昨日はとりあえず導入して動かしてみて動いたところで終わっていたので、プログラムと併用して使う場合を考えたいと思います。

で、使えるプログラミング言語かつ情報がありそうなものを探すと・・・
どれも使いづらそう・・・。

環境的にというより、私の能力的にという意味で。
一番慣れ親しんでいるC/C++もつかえるようですが、Linuxで扱うことがほとんどなかったということと、ドキュメントが見つからないのでのちのちということにしました。

スクリプト系はCGIはやる気が最近ないので、やめておきたい気持ちが凄くあります。
そしてCGI以外でスクリプト系かつKVSを使うようなプログラムが思いつかない。
(Windowsで気楽に開発できるのならLuaなんて手もあったんですが、今回は環境を一から作るのが面倒なので後回し)

上と同じくのWindows(ry の理由でC#も頓挫。

で結局Javaが今のところ一番環境的にもドキュメント的にもやりやすいのではということになりました。
実は一度MySQLJDBCをやろうとしたんですが失敗したという苦い経験があります。
しかし今回はJDBCではなく、JRedisなるものを使ってみようと思います。(とある情報でJDBCだと日本語が対応してないという話だったのでそうしたというだけですが・・・)

意外とすんなり動いてくれたので、少々驚きました。
やはりKVSの方が仕組みが簡単な分、扱いやすいのでしょう。


とりあえずRedisの導入は前回のブログで書いたので、今回はJRedisの導入と使い方について。

JRedisはhttp://code.google.com/p/jredis/からダウンロードしてきます。

ダウンロードしてきたファイルを展開して、その中にある"/Release/jredis-1.0-rc1.jar"というファイルをビルドパスに追加します。

そして、次のような感じで使います。

import java.io.*;

// redis用のインポート(jredis-1.0-rc1.jarが必要)
import org.jredis.ClientRuntimeException;
import org.jredis.JRedis;
import org.jredis.ProviderException;
import org.jredis.RedisException;
import org.jredis.protocol.Command;
import org.jredis.ri.alphazero.JRedisClient;
import org.jredis.ri.alphazero.support.DefaultCodec;

public class Sample {

    public static void main(String[] args) throws IOException {
    
    BufferedReader r =
            new BufferedReader(new InputStreamReader(System.in), 1);

    while (true){
    System.out.println("Name:\n");
    String name = r.readLine();
    System.out.println("tweet:\n");
    String tweet = r.readLine();
    
        try {
            
            // Redisが動いているサーバのIPアドレスとポート番号を指定
            JRedis jredis = new JRedisClient("127.0.0.1",6379);

            // list(今回はname)の末尾ににvalue(今回はtweet)を挿入
            jredis.rpush(name, tweet);
            
            // nameに対応するリストを表示</span>
            System.out.println(DefaultCodec.toStr(jredis.lrange(name, 0, -1)));
            
        } catch (RedisException error) {
            if (error.getCommand() == Command.PING) {
                System.out.format("パスワードが必要かもしれません。"+
                                          "コマンドライン引数にパスワードを入力して実行してみてください。\n");
            }
        } catch (ProviderException bug) {
            System.out.format("%s\n", bug.getMessage());
            
        } catch (ClientRuntimeException problem) {
        System.out.format("%s\n", problem.getMessage());
        }
        
        System.out.println("終了しますか? yes/no\n");
        
        String str = r.readLine();
        if (str.equals("y") || str.equals("yes"))
        break;
    }
}

という感じです。
これは次のように動作します。

Name:
Naoki_Rin
tweet:
こんにちは。
[こんにちは。]
終了しますか? yes/no
no
Name:
Naoki_Rin
tweet:
はじめまして。
[こんにちは。, はじめまして。]
終了しますか? yes/no

といった感じです。

とりあえずお遊び半分で作った部分の入出力などはさておき重要なのは次の部分です。

まずはインポート宣言。

// redis用のインポート(jredis-1.0-rc1.jarが必要)
import org.jredis.ClientRuntimeException;
import org.jredis.JRedis;
import org.jredis.ProviderException;
import org.jredis.RedisException;
import org.jredis.protocol.Command;
import org.jredis.ri.alphazero.JRedisClient;
import org.jredis.ri.alphazero.support.DefaultCodec;

次に接続。

// Redisが動いているサーバのIPアドレスとポート番号を指定
JRedis jredis = new JRedisClient("127.0.0.1",6379);

これであとはjredis.[コマンド名](引数)を与えると基本的にRedisのコマンドと同じ動作をするようです。

一応例外処理はすべきです。

catch (RedisException error) {
    if (error.getCommand() == Command.PING) {
        System.out.format("パスワードが必要かもしれません。"+
                          "コマンドライン引数にパスワードを入力して実行してみてください。\n");
    }
} catch (ProviderException bug) {
    System.out.format("%s\n", bug.getMessage());
            
} catch (ClientRuntimeException problem) {
    System.out.format("%s\n", problem.getMessage());
}

以上で適当ですが説明は終わりです。

これで基本的に使えると思います。あとはRedisのデータ型やコマンドなどを使えればいいのではないでしょうか。
ただ実際にサーバで使う場合は、トラフィックの推移がRedisの処理によって変動してしまうような場合もあり、設定を細かくいじる必要もあるようです。
このあたりはまだ長い目で見る必要はありそうです。

初心者にとってはインメモリ型のKVSというのは扱いやすいのではないかと思います。
今回は使っただけで終わってしまっているので、今度はWebアプリケーションや、Luaなどで使えればいいなと思います。