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

申し訳ありませんが、正しい結果が返されています。間違って読んでいました。本当に2つの落とし穴があります:

  • ビットは右から左に書き込まれます。バイトが返されるとき、それは本質的に期待されるものの逆の順序になります(少なくとも私が期待する)。したがって、上記の例では。このようなバイトが返送されました(予想とは逆)

[0] false [1] false [2] false [3] false [4] true [5] false [6] true [7] false

  • バイト順に読み取る必要があります。バイト0には最初の8ビットが含まれ、1には次のビットのセットが無限に含まれます。これは、ポイント#1で説明したビット反転のため、注意することが重要です。元の例で、Redisでオフセット10をtrueに設定した場合、これはビット位置13に表示されます。これは、オフセット(ビット)0〜7が最初のバイトに格納され、オフセット8〜15がに格納されるためです。 2番目のバイト。オフセット10は2番目のバイトに格納されている3番目であり、逆であるため、15,14...13からカウントバックします。

重要なのは、実際には処理する前にバイト/ビットを逆にすることだと思います...これが将来誰かを助けることを願っています...

于 2012-07-24T18:59:49.760 に答える