gpt4 book ai didi

redis - 使用 Booksleeve 处理 Int64 值

转载 作者:IT王子 更新时间:2023-10-29 06:12:03 26 4
gpt4 key购买 nike

我对 Marc Gravell 的 Booksleeve 图书馆有疑问。

我试图了解 booksleeve 如何处理 Int64 值(实际上我在 Redis 中有 billion 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,long是用ascii编码的?

为什么不使用 byte[] ?我知道我可以使用 byte[] 覆盖来执行此操作,但我只想了解此实现以优化我的。可能跟Redis存储有关系。

预先感谢 Marc :)

P.S:我仍然对你的下一个主要版本非常热心,因为我可以使用长值键而不是字符串。

最佳答案

它以 ASCII 格式写入,因为 这就是 redis protocol 的内容要求

如果你仔细看,它总是编码为 ASCII - 但对于最常见的情况(0-9、10-99)我有特殊情况它,因为这些都是非常简单的结果:

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

其中 xy 是 0-99 范围内数字的前两位,XY 是那些数字(作为数字)偏移 48 ('0') - 所以十进制 17 成为字节序列(十六进制):

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

当然,这也可以简单地通过按顺序写入每个数字并将数字值偏移 48 ('0') 并处理负号来实现 - 我想答案是只是“因为我用简单但显然正确的方式对其进行了编码”。考虑值 -123 - 编码为 $4\r\n-123\r\n(嘿,别看我 - 我没有设计协议(protocol))。这有点尴尬,因为它需要先计算缓冲区长度,然后写入缓冲区长度,然后写入值 - 记住按 100s、10s、1s 的顺序写入(这比写入要难得多反过来)。

非常愿意重新访问它 - 简单地说:它有效。

当然,如果您有可用的暂存缓冲区,它就变得微不足道了——您只需按简单的顺序编写它,然后反转暂存缓冲区的部分。我会检查是否有可用的(如果没有,添加一个也不是不合理的)。

我还应该澄清一下:还有整数类型,它将 -123 编码为 :-123\r\n - 然而,从内存中有一个很多地方这根本不起作用

关于redis - 使用 Booksleeve 处理 Int64 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17590625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com