作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有大量的 bitset 数据,存储在 db 中。我想把它上传到redis bitset,这样我就可以对其进行位操作了。有没有办法从 redis-cli 或 javascript 代码上传这些数据?我正在使用 bitset.js npm 模块从 db 加载我的程序中的位集。
一个明显的方法是在我的 javascript 代码中迭代我的 bitset 数组并多次调用 redis.setbit(...)。有没有办法一次上传所有这些?如果是怎么办?
最佳答案
Redis中的bitset其实就是一个字符串,所以可以一次性直接赋值给它。字符串中的位是位域的位,按从左到右的顺序设置。 IE。将位号 0 设置为 1 会产生二进制数 10000000
,或值为 128 的单个字节。这在 Redis 打印时看起来像 "\x80"
,您可以通过运行 setbit foo 0 1
然后在 Redis 中运行 get foo
自己看看。
因此,要构造正确的字符串以发送到 Redis,我们只需要从您的 BitSet 中读取位并构造一个缓冲区,一次一个字节,并设置适当的位。
下面是使用 bitset.js 和 redis npm 模块将 JavaScript 中的 BitSet 转换为 Redis key 的代码。请注意,此代码假定位域适合内存。
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();
});
});
});
关于redis bitset -- 如何上传现有的 bitset 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37811613/
我是一名优秀的程序员,十分优秀!