Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis 用booksheeve处理Int64值_Redis_Booksleeve - Fatal编程技术网

Redis 用booksheeve处理Int64值

Redis 用booksheeve处理Int64值,redis,booksleeve,Redis,Booksleeve,我有一个关于马克·格雷威尔的书套图书馆的问题 我试图了解booksleeve是如何处理Int64的价值的(实际上我在Redis中有10亿美元的长期价值) 我使用反射来取消设置长值覆盖 // BookSleeve.RedisMessage protected static void WriteUnified(Stream stream, long value) { if (value >= 0L && value <= 99L) { int i = (int)v

我有一个关于马克·格雷威尔的书套图书馆的问题

我试图了解booksleeve是如何处理Int64的价值的(实际上我在Redis中有10亿美元的长期价值)

我使用反射来取消设置长值覆盖

// 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);
}
//booksheeve.RedisMessage
受保护的静态void WriteUnified(流,长值)
{

如果(value>=0L&&value,它将以ASCII格式写入,因为这是需要的

如果仔细观察,它总是以ASCII编码,但对于最常见的情况(0-9、10-99),我对它进行了特殊处理,因为这些都是非常简单的结果:

 x => $1\r\nX\r\n
xy => $2\r\nXY\r\n
其中,
x
y
是0-99范围内数字的前两位,
x
y
是偏移48(
'0'
)的数字,因此十进制17成为字节序列(十六进制):

当然,这也可以简单地通过顺序写入每个数字并将数字值偏移48(
'0'
)和处理负号来实现——我猜答案很简单,“因为我用简单但显然正确的方式编码”考虑值<代码> -123 -编码为“代码> $4 \ r\n-123\r\n\/c>”(嘿,不要看我——我没有设计协议)。它稍微有点尴尬,因为它需要先计算缓冲区长度,然后写那个缓冲区长度,然后写值-记住以100s、10s、1s的顺序写入。(这比反过来写要困难得多)

非常愿意重新审视它——简单地说:它是有效的

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


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

谢谢你,马克,我的错,我没有意识到这一点。我应该更关注Redis协议。谢谢你的回答。
24-32-0D-0A-31-37-0D-0A