我有一个关于 Marc Gravell 的 Booksleeve 图书馆的问题。
我试图了解 bookleeve 如何处理 Int64 值(实际上我在 Redis 中有十亿长值)
我使用反射来理解设置长值覆盖。
// 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 有两位以上的 long 是用 ascii 编码的?
为什么不使用 byte[] ?我知道我可以使用 byte[] 覆盖来做到这一点,但我只想了解这个实现来优化我的。可能与 Redis 存储有关系。
提前谢谢你,马克:)
PS:我仍然非常热衷于你的下一个主要版本,而不是我可以使用长值键而不是字符串。