1

我可能正在处理这一切都错了,但我想使用 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 进行单独调用,但这似乎会给服务器带来大量往返。任何帮助,将不胜感激!

4

1 回答 1

1

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

  • 这些位是从右向左写入的。当返回一个字节时,它基本上与预期的顺序相反(至少在我看来)。所以在上面的例子中。我被发回了一个看起来像这样的字节(与我预期的相反)

[0] 假 [1] 假 [2] 假 [3] 假 [4] 真 [5] 假 [6] 真 [7] 假

  • 您需要按字节顺序读取。字节 0 将包含前 8 位,1 包含下一组位,无穷无尽。由于第 1 点中提到的位反转,这一点很重要。如果在我的原始示例中,我在 Redis 中将偏移量 10 设置为 true,这将显示在位位置 13。这是因为偏移量(位)0-7 存储在第一个字节中,而偏移量 8-15 存储在第二个字节。偏移量 10 是存储在第二个字节中的第三个,由于它是反向的,我们从 15,14...13 倒数

我想关键实际上是在处理之前反转字节/位......希望这对未来的人有所帮助......

于 2012-07-24T18:59:49.760 回答