2012-07-24 57 views
1

我可能會接近這一切都錯了,但我想使用REDIS位圖來跟蹤我的應用程序內的活動。我有一個像下面的一段代碼:我如何從Redis返回一個C#bitarray與Booksleeve

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]假 [2]假 [3]假 [4]真 [5]假 [6]真 [7]假

  • 你需要的字節順序來閱讀。字節0將包含前8位,下一組位,無限期。由於第1點中提到的位反轉,這一點很重要。如果在我的原始示例中,我在Redis中將偏移量10設置爲true,則會在第13位顯示。這是因爲偏移量(位)0-7存儲在第一個字節中,而偏移量8-15存儲在第二個字節。偏移10是存儲在第二個字節第三位,並且由於它的反向我們指望從15,14回來...... 13

我猜的關鍵其實是處理之前扭轉字節/位......希望這有助於在未來的人...

+1

我很高興你找到答案,但位指數非常**總是**從右到左寫。這樣,第0位是LSB,不管它結束多長時間。 – 2012-07-24 21:01:53

+0

@MarcGravell感謝您的反饋。我猜這只是在索引有意義時才重要,比如在下面的例子中,索引用來反映user_id。這是有道理的,還是我錯過了什麼? http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/ – 2012-07-24 21:06:22

+0

哦,對,我想我明白了。告訴你什麼,把它留給我。今晚我不在PC上,但明天我會檢查一切是否正常。 – 2012-07-24 21:19:11

相關問題