Redisプロトコルのビギナーズガイド
Redisの最も優れた未発表の機能の1つは、ワイヤープロトコルです。これが、Redisが高品質のクライアントライブラリの最大のエコシステムの1つを持っている理由です。 Redisワイヤープロトコルは非常にシンプルであるため、Redisのすべての主要機能を実装するクライアントを簡単に構築できます。また、高速で効率的なクライアントライブラリを簡単に作成できるように設計されています。
RESPとは何ですか?
RESP( RE dis S erialization P rotocol)は、RedisクライアントとサーバーがTCPを介して相互に通信するために使用するテキストベースのプロトコルの名前です。サーバーとクライアント間のすべての通信は、5つの基本的なタイプで構成されています。
- 単純な文字列 「OK」(書き込みコマンドが成功した後)や「PONG」(PINGコマンドへの応答が成功した後)などの一般的なサーバー応答に使用されます。
- 一括文字列 GET、LPOP、HGETなどのほとんどすべての単一値読み取りコマンドに対して返されます。バルク文字列は、改行、制御文字、さらにはvalidRESPなど、すべてエスケープまたはエンコードせずに何でも含めることができるという点で、単純な文字列とは異なります。
- 整数 STRLEN、HLEN、BITCOUNTなどのあらゆる種類のカウントコマンドの応答として使用されます。
- 配列 他の配列を含む任意の数のRESPオブジェクトを含めることができます。これは、サーバーにコマンドを送信するため、およびHGETALL、LRANGE、MGETなどの複数の要素を返す応答に使用されます。
- エラー 間違ったタイプのデータを保持しているキーに対してコマンドを実行しようとした場合など、コマンドの処理中にRedisでエラーが発生した場合は常に返されます。
RESPを読み書きするとき、キーや値のエスケープやエンコードを行う必要はありません。実際に解析する必要があるRESPの唯一の部分は、各RESPオブジェクトに含まれる単純なメタデータです。
RESPはどのように見えますか?
すべてのRESPオブジェクトは、プレフィックス文字で始まり、ラインターミネータで終わります(独自のラインターミネータを含まない配列を除く)。 RESPオブジェクトの最も簡単な例は、OK
です。 単純な文字列応答:
+OK\r\n
(RESPは人間が読める形式のプロトコルですが、わかりやすくするために、改行を明示的に書き出します(\r\n
)すべてのRESPの例で。)
上記の単純な文字列では、+
単純な文字列プレフィックスOK
は単純な文字列の本文であり、\r\n
この単純な文字列の終わりを示す行末記号です。
単純な文字列を読み取るには、次の\r\n
まで読み取ります。 lineterminator、前のバイトを返します(最大+
)返される応答文字列として。これが機能するのは、RESPの単純な文字列に改行文字を含めることができないためです。
エラーと整数は単純な文字列と同様にフォーマットされますが、異なるプレフィックスを使用します。エラーの前には-
が付いています :
-ERR unknown command 'GETT'\r\n
また、整数のプレフィックスは:
です。 :
:99\r\n
バルクストリングは、2つの部分があるという点で独特です。長さの仕様と本体:
$13\r\nHello, World!\r\n
$
バルク文字列プレフィックス、13
は実際の文字列本体のバイト数であり、次に\r\n
長さの指定を終了します。 Hello, World!
は13バイトの文字列本体であり、これも\r\n
で終了します。 (これは文字列本体の一部ではありません)。
バルク文字列コンテナは本文の正確な長さを提供するため、実際の文字列本文を解析して末尾を見つける必要はありません。文字列の内容を検査せずに、ソケットからさらに13バイト(および最終行のターミネータ)を読み取ることができます。これは、コンテンツをエンコードしたりエスケープしたりすることなく、文字列の本文に必要なすべてのデータを使用できることを意味します。
配列も長さの指定で始まります。ただし、長さフィールドは、配列の内容のバイト数ではなく、配列内のオブジェクトの数を示します。
*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n
上記の例では、2つのバルク文字列(foo
)を含む配列があります。 およびbar
)。配列の長さの指定では、バルク文字列を読み取るときにできることをスキップすることはできませんが、クライアントに配列を簡単に実装できます。配列サイズを読み取り、さらに多くのオブジェクトを読み取り、それらのすべてのオブジェクトを最終的な配列に返します。
すべてのRedisコマンドは、バルク文字列の配列として送信されます。たとえば、コマンド「SET mykey‘my value’」は次のように記述されて送信されます。
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$8\r\nmy value\r\n
RESPで使用される接頭辞付きの長さにより、複雑な状態モデリングやデータの複数のパスを実行することなくパーサーを実装できるため、非常に高速なパーサーを構築できます。
nullバルク文字列やnull配列など、ここでは取り上げていない詳細がいくつかあります。詳細については、公式ドキュメント(通常どおり)にRESPの非常に読みやすく包括的なドキュメントページがあります。
プロトコルをよりよく理解するための優れた方法は、simpleclientを自分で実装してみることです。 GonextでRedisプロトコルを読み書きするためのガイドを確認してください。
-
Redis SETRANGE –Redisの文字列値の一部を更新する方法
このチュートリアルでは、redisデータストアの指定されたキーに格納されている文字列値の一部を更新する方法について学習します。このために、Redisの SETRANGEを使用します コマンド。 SETRANGEコマンド このコマンドは、文字列値の更新部分の開始インデックスを決定する開始(両端を含む)オフセットを取ります。開始オフセットが文字列値の長さよりも大きい場合、開始オフセットを適合させるために、文字列値にゼロバイトが埋め込まれます。インデックスはゼロベースであるため、0は最初の要素を意味し、1は2番目の要素を意味します。 キーがredisデータストアに存在しない場合、操作を実行する
-
Redis STRLEN –Redisデータストアで文字列値の長さを取得する方法
このチュートリアルでは、キーに格納されている文字列値の長さを取得する方法について学習します。このために、Redis STRLENを使用します コマンド。 STRLENコマンド このコマンドは、キーに格納されている文字列値の長さ(文字数)を返します。キーがredisデータストアに存在しない場合、空の文字列として解釈され、0が返されます。 RedisSTRLENコマンドの構文は次のとおりです:- 構文:- redis host:post> STRLEN <key name> 出力:- (integer) value, representing the number