1

Marc Gravell の Booksleeve ライブラリについて質問があります。

booksleeve が Int64 値を処理する方法を理解しようとしました (実際、Redis には 10 億の長い値があります)

リフレクションを使用して、Set long 値のオーバーライドを理解しました。

// BookSleeve.RedisMessage
protected static void WriteUnified(Stream stream, long value)
{
if (value >= 0L && value <= 99L)
{
    int i = (int)value;
    if (i <= 9)
    {
        stream.Write(RedisMessage.oneByteIntegerPrefix, 0, RedisMessage.oneByteIntegerPrefix.Length);
        stream.WriteByte((byte)(48 + i));
    }
    else
    {
        stream.Write(RedisMessage.twoByteIntegerPrefix, 0, RedisMessage.twoByteIntegerPrefix.Length);
        stream.WriteByte((byte)(48 + i / 10));
        stream.WriteByte((byte)(48 + i % 10));
    }
}
else
{
    byte[] bytes = Encoding.ASCII.GetBytes(value.ToString());
    stream.WriteByte(36);
    RedisMessage.WriteRaw(stream, (long)bytes.Length);
    stream.Write(bytes, 0, bytes.Length);
}

stream.Write(RedisMessage.Crlf, 0, 2);
}

int64 が 2 桁を超える場合、long が ascii でエンコードされる理由がわかりません。

byte[] を使用しないのはなぜですか? これを行うために byte[] オーバーライドを使用できることはわかっていますが、この実装を理解して最適化したいだけです。Redis ストレージとの関係がある可能性があります。

前もってマークに感謝します:)

PS : 文字列の代わりに長い値のキーを使用できるよりも、次のメジャー バージョンについてはまだ非常に熱心です。

4

1 に答える 1

2

これは、 redis プロトコルが要求するものであるため、ASCII で書き込みます。

注意深く見ると、常にASCII としてエンコードされていますが、最も一般的なケース(0 ~ 9、10 ~ 99) については、非常に単純な結果であるため、特殊なケースにしました。

 x => $1\r\nX\r\n
xy => $2\r\nXY\r\n

ここでx、 とyは 0 ~ 99 の範囲の数字の最初の 2 桁であり、XYはこれらの数字 (数字として) が 48 ( ) オフセットされている'0'ため、10 進数の 17 がバイト シーケンス (16 進数) になります。

24-32-0D-0A-31-37-0D-0A

もちろん、これは、各桁を順番に書き込み、桁の値を 48 ( '0') オフセットし、負の符号を処理することで簡単に達成することもできます。答えは単純に「単純だが明らかに正しい方法でコーディングしたから」だと思います。 . 値を考えてみましょう- これは(ねえ、私を見ないでください - 私はプロトコルを設計していません)-123としてエンコードされています。最初にバッファ長を計算し、次にそのバッファ長を書き込み$4\r\n-123\r\n、次に値を書き込む必要があるため、少し厄介です.100、10、1の順序で書き込むことを忘れないでください(逆に書き込むよりもはるかに困難です)。

それを完全に再訪したいと思っています - 簡単に言えば、それは機能します。

もちろん、利用可能なスクラッチ バッファがあれば簡単です。単純な順序で書き込んでから、スクラッチ バッファの部分を逆にするだけです。利用可能かどうかを確認します (利用できない場合は、追加しても問題ありません)。

また、明確にする必要があります。次のようにエンコード-123される整数型もありますが、メモリからは、これが単に機能しない:-123\r\n場所がたくさんあります。

于 2013-07-11T11:13:36.117 に答える