【问题标题】:Dealing with Int64 value with Booksleeve用 Booksleeve 处理 Int64 值
【发布时间】: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


    【解决方案1】:

    它以 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(嘿,别看我 - 我没有设计协议)。这有点尴尬,因为它需要先计算缓冲区长度,然后写入该缓冲区长度,然后写入值 - 记住按 100s、10s、1s 的顺序写入(这比写入要困难得多)反过来)。

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

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

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

    【讨论】:

    • 谢谢你,马克,我不知道这一点。我应该更加注意 Redis 协议。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2013-02-07
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多