Symfoware

Symfowareについての考察blog

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

ここでライブラリを使用せず、自前でRedisにデータを登録してみました。
ライブラリに依存しないJavaプログラムでRedisにデータを登録、取得する(SET、GET)

これ、改行を含むデータを登録したい時に上手く行きません。
どうやればいいか調べていると、jedisProtocol.javaに答えがありました。

Protocol.java


プロトコル仕様




SET key-name value\r\n



こうやってデータを登録する以外に、もうひとつコマンドを実行する方法があるようです。


*[コマンドの総数]
$[最初のコマンドのバイト数]
[最初のコマンド]
$[次のコマンドのバイト数]
[次のコマンド]
$[次のコマンドのバイト数]
[次のコマンド]
...




具体的に、最初のSETコマンドを分解すると、
コマンドの総数3
最初のコマンド「SET」のバイト数3
SET
次のコマンド「key-name」のバイト数8
key-name
最後のコマンド「value」のバイト数5
value


実行するのは以下の内容になります。


*3
$3
SET
$8
key-name
$5
value




telnetでredisに接続して実行している様子はこちら。

385_01.png


この方法でもちゃんと値が登録できています。




プログラム



上記を踏まえ、登録プログラムを修正してみます。


  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. public class RedisSetSample {
  6.     
  7.     public static void main(String[] args) {
  8.         String host = "192.168.1.111";
  9.         int port = 6379;
  10.         try {
  11.             // ソケットを生成
  12.             Socket socket = new Socket(host, port);
  13.             // 出力ストリーム
  14.             OutputStream osw = socket.getOutputStream();
  15.             // 入力ストリーム
  16.             InputStream is = socket.getInputStream();
  17.             
  18.             // コマンド総数
  19.             osw.write("*3\r\n".getBytes());
  20.             
  21.             // 最初のコマンド「SET」のバイト数と、実際のコマンド指定
  22.             osw.write("$3\r\n".getBytes());
  23.             osw.write("SET\r\n".getBytes());
  24.             
  25.             // 次のコマンド「key-name」のバイト数と、実際のコマンド指定
  26.             osw.write("$8\r\n".getBytes());
  27.             osw.write("key-name\r\n".getBytes());
  28.             
  29.             // 最後のコマンド「va\nlue」のバイト数と、実際のコマンド指定
  30.             osw.write("$6\r\n".getBytes());
  31.             osw.write("va\nlue\r\n".getBytes());
  32.             
  33.             //サーバーに送信
  34.             osw.flush();
  35.             // 読み込み待ち
  36.             while (is.available() == 0);
  37.             
  38.             // 読み込んだ内容をそのまま出力ストリームに書き出す
  39.             while (is.available() != 0) {
  40.                 byte[] data = new byte[is.available()];
  41.                 is.read(data);
  42.                 System.out.print(new String(data));
  43.             }
  44.             System.out.println();
  45.             // 入出力ストリームを閉じる
  46.             osw.close();
  47.             is.close();
  48.             // ソケットを閉じる
  49.             socket.close();
  50.         } catch (IOException e) {
  51.             e.printStackTrace();
  52.         }
  53.     }
  54. }




プログラムを実行した後、データを検索してみます。

385_02.png


ちゃんと改行込みのデータが登録出来ました。



【参考URL】

https://github.com/xetorthio/jedis/

関連記事

テーマ:データベース - ジャンル:コンピュータ

  1. 2014/03/23(日) 14:06:07|
  2. Redis
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<高速軽量なPython WSGI Server「bjoern」でBottleフレームワークを動かす | ホーム | RedisのJDBCドライバもどきを作ってみる>>

コメント

コメントの投稿


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

トラックバック

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