我需要在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客户端。
答案 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);
}
希望有所帮助