2017-04-08 4 views
1

私はRedisビットマップを反復処理し、すべての設定ビットのオフセットを取得しようとしています。Redis - ビットマップを繰り返して設定ビットを取得

私はいくつかの方法を試みましたが、それらのすべてが失敗しました。ここでは、私はマックスウェルのRedis Essentialsの本から抜粋しました。私は何度もコードを調べたが、何がうまくいかないのか分からない。

var bitmap = 'test'; 
redisClient.get(bitmap, function(err, bitmapValue){ 
    var userIds = []; 

    var data = bitmapValue.toJSON().data; 
    data.forEach(function(byte, byteIndex){ 
     for(var bitIndex = 7; bitIndex >= 0; bitIndex--) { 
      var visited = byte >> bitIndex & 1; 
     } 
     if(visited === 1) { 
      var userId = byteIndex * 8 + (7 - bitIndex); 
      userIds.push(userId); 
     } 
    }) 

    console.log(userIds); 
}); 

ほとんどの場合、通常はビットマップが小さいときに空の結果が得られます。私は大規模なビットマップをしようとすると、私は唯一の91

[8, 
16, 
32, 
144, 
176, 
256, 
320, 
440, 
456, 
520, 
584, 
592, 
624, 
640, 
648, 
680, 
696, 
704, 
712, 
720, 
752, 
760, 
848, 
1056, 
1088, 
1104, 
1112, 
1120, 
1136, 
1144, 
1160, 
1168, 
1224, 
1248, 
1264, 
1280, 
1312, 
1328, 
1424, 
1480, 
1496, 
1544, 
1600, 
1680, 
1792, 
1824, 
1840, 
1904, 
1976, 
2080, 
2112, 
2144, 
2224, 
2240, 
2296, 
2392, 
2400, 
2504, 
2512, 
2584, 
2616, 
2712, 
2856, 
2880, 
2912, 
2976, 
3048, 
3288, 
3328, 
3352, 
3360, 
3368, 
3376, 
3432, 
3440, 
3496, 
3600, 
3616, 
3624, 
3632, 
3704, 
3752, 
3776, 
3832, 
3880, 
3936, 
4056, 
4264, 
4296, 
4352, 
4376] 

答えて

1

Iドンを得ながら、私は、間違っている私は以下のようになりましたサンプルの結果は、そのビットマップのBITCOUNTが690である8の倍数の完全な配列を取得しますあなたがキーtestの下に保存したビットマップを持っていないので、テストは難しいです。しかし、コードを読むと、ifステートメントが間違って配置されているように見えます。 -

var bitmap = 'test'; 
redisClient.get(bitmap, function(err, bitmapValue){ 
    var userIds = []; 

    var data = bitmapValue.toJSON().data; 
    data.forEach(function(byte, byteIndex){ 
     for(var bitIndex = 7; bitIndex >= 0; bitIndex--) { 
      var visited = byte >> bitIndex & 1; 
      if(visited === 1) { 
       var userId = byteIndex * 8 + (7 - bitIndex); 
       userIds.push(userId); 
      } 
     } 
    }) 

    console.log(userIds); 
}); 
+0

これはうまくいきました。 –