我有大量的位集数据,存储在db中。我想将其上载到redis bitset,因此可以对其执行位操作。有没有办法从redis-cli或javascript代码上传此数据?我正在使用bitset.js npm模块从数据库中加载程序中的位集。
一种明显的方法是在我的javascript代码中迭代我的bitset数组,并多次调用redis.setbit(...)。有没有办法一次上传所有这些文件?如果可以,怎么办?
Redis中的位集实际上只是一个字符串,因此您可以一次直接分配给它。字符串中的位是位字段的位,以从左到右的顺序设置。即,将位号0设置为1会产生二进制数10000000
,或单个字节,其值为128。这看起来像是"\x80"
Redis打印它时一样,您可以先运行setbit foo 0 1
然后get foo
在Redis中查看。
因此,要构造正确的字符串以发送到Redis,我们只需要从BitSet中读取这些位,并构造一个缓冲区(每次1个字节),并设置适当的位即可。
以下是使用bitset.js和redis npm模块将JavaScript中的BitSet转换为Redis密钥的代码。请注意,此代码假定该位字段适合放入内存。
let redis = require('redis'),
BitSet = require('./bitset');
let client = redis.createClient();
// create some data
let bs = new BitSet;
bs.set(0, 1);
bs.set(31, 1);
// calculate how many bytes we'll need
var numBytes = Math.ceil(bs.msb()/8);
// construct a buffer with that much space
var buffer = new Buffer(numBytes);
// for each byte
for (var i = 0; i < numBytes; i++) {
var byte = 0;
// iterate over each bit
for (var j = 0; j < 8; j++) {
// slide previous bits to the left
byte <<= 1;
// and set the rightmost bit
byte |= bs.get(i*8+j);
}
// put this byte in the buffer
buffer[i] = byte;
}
// now we have a complete buffer to use as our value in Redis
client.set('bitset', buffer, function (err, result) {
client.getbit('bitset', 31, function (err, result) {
console.log('Bit 31 = ' + result);
client.del('bitset', function () {
client.quit();
});
});
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句