Redis - 通过位图迭代以获取设置位

时间:2017-04-08 07:56:26

标签: javascript 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);
});

大部分时间我得到空结果,通常是在位图很小的时候。当我尝试大位图时,我得到的数组满是8的倍数。我得到的样本结果如下所示,这是不正确的,该位图的bitcount是690,而我只有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 个答案:

答案 0 :(得分:1)

我没有存储在密钥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);
});