如何使用Booksleeve从Redis返回C#位阵列

时间:2012-07-24 16:47:00

标签: c# redis booksleeve

我可能接近这一切都错了,但我想使用REDIS位图来跟踪我的应用程序中的活动。我有一段代码如下:

 using (var conn = new RedisConnection("localhost"))
        {
            conn.Open();

            var b1 = conn.Strings.SetBit(1, "test:2012-07-25", 1, true);
            conn.Wait(b1);

            var b2 = conn.Strings.SetBit(1, "test:2012-07-25", 3, true);
            conn.Wait(b2);


            var arr = conn.Strings.Get(1, "test:2012-07-25");
            conn.Wait(arr);


            BitArray bits = new BitArray(arr.Result);

        }

我可以毫无问题地添加条目(b1和b2)。但是,当我尝试将位图作为比特阵列从服务器返回时,它无法正常工作(我得到一个值,但设置的位完全不正确)。我假设我在使用Strings.Get函数尝试返回位时做错了什么,但我不知道怎么回事。唯一明显的做法是对我感兴趣的每个日期单独调用getbit,但这似乎会引入大量的往返服务器。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

对不起朋友们,正在返回正确的结果,我读错了。真的有两个陷阱:

  • 这些位从右到左书写。当返回一个字节时 基本上会与预期的顺序相反 (至少我期待)。所以在上面的考试中。我被送回了 看起来像这样的字节(与我的预期相反)

[0]假 [1]错误 [2]错误 [3]错误 [4]是的 [5]错误 [6]是的 [7]错误

  • 您需要按字节顺序读取。字节0将包含前8位,1包含下一组位,无限制。由于第1点中提到的位反转,这一点非常重要。如果,在我的原始示例中,我在Redis中将偏移量10设置为true,则这将显示在位位置13中。这是因为偏移量(位)0-7存储在第一个字节中,偏移量8-15存储在第二个字节。偏移量10是存储在第二个字节中的第3个,因为它反过来我们从15,14 ... 13开始计算

我想密钥实际上是在处理之前反转字节/位...希望这可以帮助某人将来...