如何在JavaScript中初始化Redis中的位图

时间:2014-10-11 08:37:40

标签: node.js redis

我需要在Redis中初始化一个大位图,其中一组4 * n位都等于1.如果我这样做:

var redis = require('redis');
var client = redis.createClient();
var n = 8;
var mask = '\\x';
for (var i = 0; i < n; ++i) {
  mask += 'f';
}
client.set('mybitmap', mask, callback);

... mybitmap设置为xffffffff而不是所需的\xffffffff

有关如何以这样的方式逃避JavaScript反斜杠的想法,我们不会在Redis中丢失它吗?

注意:我使用的是node_redis客户端。

1 个答案:

答案 0 :(得分:2)

似乎你不能使用redis客户端只放置一个“1”位的位图。 事实上,如果你像这样建立你的字符串:

var mask = ''; 
for (var i = 0; i < n; ++i) {
  mask += String.fromCharCode(0xffff);
}

你会在Redis中得到类似的东西:     11101111     10111111     10111111     11101111     10111111     10111111     11101111     10111111     10111111     11101111     10111111

虽然我确保在Javascript中以下情况属实: String.fromCharCode(0xffff).toString().charCodeAt(0) === 0xffff

(由于这个https://stackoverflow.com/a/3482698/667433我有些疑惑),在Node的Redis客户端和Redis之间的某个位置丢失了一些位。

构建简单“1”位图的解决方案是将所有“0”和NOT放在其上:

var client = require('redis').createClient();

var n = 8;
var mask = new Array(n + 1).join(String.fromCharCode(0));
client.set('mybitmap', mask, function() {
  client.bitop(['not', 'mybitmap', 'mybitmap'], displayBits);
});

// Just to display what Redis actually stored.
function displayBits() {
  var res = '';
  (function getBit(idx) {
    if (idx === (n + 1) * 8) {
      console.log(res);
      client.quit();
      return;
    }

    client.getbit(['mybitmap', idx], function(e, r) {
     res += r;
     if ((idx + 1) % 8 === 0) { res += '\n'; }
     getBit(idx + 1);
    });
  })(0);
}

希望有所帮助