入門レベルredisクライアントの作成を手がける


Redisは、データベース、キャッシュ、およびMessage Agentとして使用できるオープンソースのメモリベースのデータ構造ストレージシステムです.Redisは多くのデータ構造をサポートし、冗長性、スクリプト、トランザクション、持続性などの豊富な機能を内蔵し、業界で愛され、さまざまなビジネスシステムで広く使用されています.使いやすいように、Redisの公式サイトでは、java、c#、python、c++などの主流のプログラミング言語をサポートする様々なプログラミング言語を推奨しています.では、Redisクライアントがこんなに豊富になった以上、なぜ自分でクライアントを作成しようとしたのかと聞かれます.私の見方は、自分のことをよく知っていて、自分でRedisクライアントを作ってみると、Redisに対する理解を深めることができるだけでなく、Redisクライアントの原理を理解することができ、今後のより良い使用、さらにはカスタム改造Redisのために十分な準備ができているということです.
知識の準備
Redisクライアントを直接開発するには、1、ネットワークプログラミングの基礎2、Redisプロトコルに精通している3、Redisの基本的な操作を理解している別の文の例はjavaで作成されるので、基本的なjavaプログラミングの知識があることが望ましい.
読者向け
本論文はRedisの各階層利用者向けである.
Redis Protocal
RedisプロトコルはRESP(REdis Serialization Protocol)と呼ばれ、クライアントはTCPプロトコルを介してクライアントの6379ポート(デフォルトポート)に接続されています.RESPプロトコルはRedis 1.2に導入されていますが、現在はRedis 2.0の標準プロトコルです.だから、Redisクライアントでこのプロトコルを実現する必要があります.
RESP説明
RESPは、単純文字列、エラー、整数、ブロック文字列、配列をサポートするシーケンス化プロトコルです.データ型はヘッダ文字に依存し、単純文字列のヘッダ文字が「+」であるヘッダ文字が「-」整数のヘッダ文字が「:」ブロック文字列全体のヘッダ文字が「$」配列のヘッダ文字が「*」であることをそれぞれ表す.
要求応答モデルにおけるRESPの使用方法
  • クライアントは、RESP全体の文字列配列の形式でRedisサーバにコマンドを送信する.
  • サーバ側は、コマンドの結果に基づいて、適切なRESPタイプを選択して
  • を返す.
    単純文字列
    単純文字列は半角プラスで始まり、その後は折り返し行を含まない文字列に続いて折り返し行で終わります.たとえば、+OKr単純文字列は非バイナリセキュリティであり、バイナリセキュリティが必要な場合は「ブロック文字列全体」を使用します.
    エラー
    エラーは単純文字列と似ていますが、頭文字は半角マイナス記号に変わりました.後に続く文字は、エラーメッセージの内容とみなすことができます.例えば、-ERR unknown command'foobar'-WRONGTYPE Operation against a key holding the wrong kind of value
    整数
    整数は単純な文字列と似ており、頭文字は半角コロンです.例として、0r:1000r
    ブロック文字列
    ブロック文字列全体は、バイナリセキュリティで最大512 MBの長さの文字列を示すために使用することができる.$記号で始まり、実際の文字列の長さに従い、折り返し行で終わり、その後実際の文字列に従い、最終的には折り返し行で終わります.例として、$6rfoobarr空文字列の表現形式は以下の通りです:$0rrnilの表現形式は以下の通りです:$-1rr
    はいれつ
    配列は半角星で始まり、配列内の要素の数を後にし、折り返し行で終わり、各要素を後にします.たとえば、空の配列:*0rは2つのブロック文字列の配列を含みます:*2r$3rfoor$3rbarrは3つの整数の配列を含みます:*3r:1r:2r:3r:3r配列はネストもサポートします.
    Redisクライアントの原理
    Redisサービス側との通信を実現するには、まず、Redisサービス側とTCP通信接続を確立し、上記のRESPプロトコルを用いて、実行したいRedisコマンドをサービス側に送信し、サービス側の応答を待機した後、応答結果を受信してユーザに示す必要がある.
    次のコードはinfoを簡単に取得する操作を実現します.
    package my_redis_client;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.nio.CharBuffer;
    
    /**
     * Hello world!
     *
     */
    public class App 
    {
        public static void main( String[] args )
        {
            //  redis       
            int port = 6379;
    
            Socket socket = null;
            BufferedReader in = null;
            PrintWriter out = null;
            
            try {
                //  tcp  
                socket = new Socket("localhost", port);
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new PrintWriter(socket.getOutputStream(), true);
                
                //  info  
                //    Redis       , RESP          
                out.println("*1\r
    $4\r
    info\r
    "); System.out.println("Redis command wat sent successfully."); // CharBuffer response = CharBuffer.allocate(1024); int readedLen = in.read(response); String responseBody = response.flip().toString(); // System.out.println(responseBody); } catch(Exception e) { e.printStackTrace(); } finally { // if (out != null){ out.close(); out = null; } if (in != null) { try { in.close(); } catch(IOException e){ e.printStackTrace(); } in = null; } if (socket != null) { try { socket.close(); } catch(IOException e){ e.printStackTrace(); } socket = null; } } } }

    実行すると、コマンドラインインタフェースにinfoの実行結果が出力されます.
    の最後の部分
    上記のコードで説明した方法によれば,クライアントの機能を拡張し続け,Redisの各種コマンドを実現することができる.
    筆者が実現
    ソースコードはご参照ください
    https://github.com/yourcaptai...
    maven中央倉庫
    
      net.yesdata
      dudu-RESP-interpreter
      1.0.4
    

    maven中央倉庫住所
    https://oss.sonatype.org