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