2012-07-24 2 views
1

이 모든 문제가 발생할 수 있습니다. 그러나 REDIS 비트 맵을 사용하여 응용 프로그램 내에서의 활동을 추적하고 싶습니다.Booksleeve로 Redis에서 C# 비트 배열을 반환하는 방법

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

죄송합니다. 올바른 결과가 반환됩니다. 잘못 읽었습니다. 실제로 두 가지 문제가 있습니다.

  • 비트는 오른쪽에서 왼쪽으로 쓰여집니다. 바이트가 반환 될 때 은 본질적으로 예상되는 것의 역순으로 될 것입니다. (적어도 내게는 기대됩니다) . 그래서 위의 예에서. I이 닮은 바이트 (I 기대했던의 역)을 반송 하였다

[0] 거짓 [1] 거짓 [2] 거짓 [3] 거짓 [4]에 해당 [5] 거짓 [6] 진정한 [7] 당신은 바이트 순서대로 읽을 필요가

  • 거짓. 바이트 0은 처음 8 비트, 다음 비트 세트, 광고 무한대를 포함합니다. 이것은 포인트 # 1에서 언급 한 비트 반전 때문에주의해야합니다. 원래 예제에서, 내가 Redis에서 true로 오프셋 10을 설정했다면, 이것은 비트 위치 13에 나타날 것입니다. 이것은 오프셋 (비트) 0-7이 첫 번째 바이트에 저장되고 오프셋 8-15가 두 번째 바이트. 오프셋 10은 세 번째 바이트에 저장되며 세 번째 바이트에 저장되므로 역수이므로 15,14에서 다시 계산합니다. 13

키가 실제로 처리하기 전에 바이트/비트를 반대로 변환하는 것입니다 ... 희망 이것은 미래에 누군가를 도와줍니다 ...

+1

당신이 답을 찾았 기 때문에 기쁩니다. 그러나 비트 인덱스는 거의 항상 ** 오른쪽에서 왼쪽으로 쓰여 있습니다. 그런 식으로, 비트 0은 LSB입니다. 얼마나 오랫동안 끝날 지에 관계없이 –

+0

@MarcGravell 피드백을 보내 주셔서 감사합니다. index가 user_id를 반영하는 데 사용되는 다음 예제와 같이 인덱스가 의미있는 경우에만 실제로 중요합니다. 그게 의미가 있습니까? 아니면 뭔가 빠져 있습니까? http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/ –

+0

오, 맞아. 내가 본 것 같아. 말해 봐, 나 한테 맡겨. 나는 오늘 밤에 PC가 아니지만, 내일 모든 것이 잘되는지 아닌지를 점검 할 것이다. –

관련 문제