Symfoware

Symfowareについての考察blog

ライブラリに依存しないJavaプログラムでRedisにデータを登録、取得する(SET、GET)

Redisに接続するためのライブラリがいくつか公開されています。
http://redis.io/clients

とりあえず、SET、GETができればよい要件があったので、自分で直接Redisに接続する
プログラムを書いて見ることにします。


仕様



GET、SET、それにデータベース切り替えのSELECTが行えるようにしてみます。

http://redis.io/commands/get
http://redis.io/commands/set
http://redis.io/commands/select


telnetコマンドでRedisに接続し、コマンドを実行してみます。


$ telnet 192.168.1.111 6379
Trying 192.168.1.111...
Connected to 192.168.1.111.
Escape character is '^]'.
SET key "value"
+OK
GET key
$5
value
QUIT
+OK
Connection closed by foreign host.




GETすると、データ長とデータが返されるようです。
QUITで接続終了。

これと同じ事をJavaプログラムで実現すればよいわけです。





SET



SETコマンドを実行するサンプルはこんな感じになりました。

※改行コードを含むバイナリデータの場合は
Redisに改行コードを含むバイナリデータを保存するプロトコル



  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. public class RedisSample {
  6.     public static void main(String[] args) {
  7.         String host = "192.168.1.111";
  8.         int port = 6379;
  9.         try {
  10.             // ソケットを生成
  11.             Socket socket = new Socket(host, port);
  12.             // 出力ストリーム
  13.             OutputStream osw = socket.getOutputStream();
  14.             
  15.             
  16.             // 入力ストリーム
  17.             InputStream is = socket.getInputStream();
  18.             // SET key "value"(改行)をサーバーに送信
  19.             osw.write("SET key \"value\"\n".getBytes());
  20.             osw.flush();
  21.             
  22.             // 読み込み待ち
  23.             while (is.available() == 0);
  24.             // 読み込んだ内容をそのまま出力ストリームに書き出す
  25.             while (is.available() != 0) {
  26.                 byte[] data = new byte[is.available()];
  27.                 is.read(data);
  28.                 System.out.print(new String(data));
  29.             }
  30.             System.out.println();
  31.             // 入出力ストリームを閉じる
  32.             osw.close();
  33.             is.close();
  34.             // ソケットを閉じる
  35.             socket.close();
  36.             
  37.         } catch (IOException e) {
  38.             e.printStackTrace();
  39.         }
  40.     }
  41. }





実行すると「+OK」と表示されます。





GET



登録したデータを検索してみます。


  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. public class RedisSample {
  6.     public static void main(String[] args) {
  7.         String host = "192.168.1.111";
  8.         int port = 6379;
  9.         try {
  10.             // ソケットを生成
  11.             Socket socket = new Socket(host, port);
  12.             // 出力ストリーム
  13.             OutputStream osw = socket.getOutputStream();
  14.             
  15.             
  16.             // 入力ストリーム
  17.             InputStream is = socket.getInputStream();
  18.             // GET key(改行)をサーバーに送信
  19.             osw.write("GET key\n".getBytes());
  20.             osw.flush();
  21.             
  22.             // 読み込み待ち
  23.             while (is.available() == 0);
  24.             // 読み込んだ内容をそのまま出力ストリームに書き出す
  25.             while (is.available() != 0) {
  26.                 byte[] data = new byte[is.available()];
  27.                 is.read(data);
  28.                 System.out.print(new String(data));
  29.             }
  30.             
  31.             // 入出力ストリームを閉じる
  32.             osw.close();
  33.             is.close();
  34.             // ソケットを閉じる
  35.             socket.close();
  36.             
  37.         } catch (IOException e) {
  38.             e.printStackTrace();
  39.         }
  40.     }
  41. }




実行してみると、データ長(改行)データ(改行)という形式でデータが取得できる模様。


$5(CRlF)
value(CRLF)




最終的にこんなプログラムになりました。


  1. import java.io.ByteArrayOutputStream;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.Socket;
  6. import java.util.Arrays;
  7. public class RedisSample {
  8.     public static void main(String[] args) {
  9.         
  10.         String host = "192.168.1.111";
  11.         int port = 6379;
  12.         try {
  13.             // ソケットを生成
  14.             Socket socket = new Socket(host, port);
  15.             // 出力ストリーム
  16.             OutputStream osw = socket.getOutputStream();
  17.             // 入力ストリーム
  18.             InputStream is = socket.getInputStream();
  19.             // GET key(改行)をサーバーに送信
  20.             osw.write("GET key\n".getBytes());
  21.             osw.flush();
  22.             
  23.             // 読み込み待ち
  24.             while (is.available() == 0);
  25.             // 読み込んだ内容を取得
  26.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  27.             int len = 0;
  28.             while ((len = is.available()) != 0) {
  29.                 // データを読み込み
  30.                 byte[] data = new byte[len];
  31.                 is.read(data);
  32.                 bout.write(data);
  33.             }
  34.             
  35.             byte[] bytes = bout.toByteArray();
  36.             len = bytes.length;
  37.             
  38.             for (int i = 1; i < len; i++) {
  39.                 if (bytes[i] != 13) {
  40.                     continue;
  41.                 }
  42.                 
  43.                 // データ長を取得
  44.                 int dataLen = Integer.parseInt(new String(bytes, 1, i - 1));
  45.                 bytes = Arrays.copyOfRange(bytes, i + 2, i + 2 + dataLen);
  46.                 break;
  47.             }
  48.             
  49.             System.out.print(new String(bytes));
  50.             
  51.             
  52.             // 入出力ストリームを閉じる
  53.             osw.close();
  54.             is.close();
  55.             // ソケットを閉じる
  56.             socket.close();
  57.             
  58.         } catch (IOException e) {
  59.             e.printStackTrace();
  60.         }
  61.         
  62.     }
  63. }





これでライブラリに依存せず、データの登録と取得が行えました。



【参考URL】

Javaでのソケット間通信サンプル

java.io.InputStreamからデータを全て読み込んでbyte配列に格納する方法
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/03/22(土) 14:59:23|
  2. Redis
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<RedisのJDBCドライバもどきを作ってみる | ホーム | Tomcat JDBC Connection Poolで通常のJavaプログラムからPostgreSQL 9.3に接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1365-67c0c9b4
この記事にトラックバックする(FC2ブログユーザー)