【发布时间】:2013-07-11 19:41:07
【问题描述】:
我有一个关于 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存储有关系。
提前谢谢你,马克 :)
P.S : 我仍然对你的下一个主要版本非常感兴趣,因为我可以使用长值键而不是字符串。
【问题讨论】:
标签: redis booksleeve