Node.js/Express.js中的Redis位集操作
我对Node.js和Redis非常陌生。我阅读了这篇文章,并希望使用一个位集来存储我的Express.js应用程序的所有用户信息,如本文所述: 我有点麻烦。在我的函数中,我获取当前年份、月份和日期,然后使用client.setbit()设置适当的键和值。但是我怎么能数所有的钥匙呢?我在Redis2.4*上,BITCOUNT命令在2.6中。还有别的办法吗?本文使用了Java位集,所以这是另一回事。我不太明白 例如,如何使用for循环来计算设置为1的所有位?是否有计算位集大小的操作,以便我可以执行以下操作:Node.js/Express.js中的Redis位集操作,node.js,redis,express,bitset,Node.js,Redis,Express,Bitset,我对Node.js和Redis非常陌生。我阅读了这篇文章,并希望使用一个位集来存储我的Express.js应用程序的所有用户信息,如本文所述: 我有点麻烦。在我的函数中,我获取当前年份、月份和日期,然后使用client.setbit()设置适当的键和值。但是我怎么能数所有的钥匙呢?我在Redis2.4*上,BITCOUNT命令在2.6中。还有别的办法吗?本文使用了Java位集,所以这是另一回事。我不太明白 例如,如何使用for循环来计算设置为1的所有位?是否有计算位集大小的操作,以便我可以执行以
for (var i = initial_offset; i < bitset_length; i++){
if (i == 1){
total_users++;
}
}
for(变量i=初始偏移量;i
还是我的做法完全错了 您需要计算Redis中存储的给定字符串的位数。 基本上有两种方法可以做到这一点:
- 您可以尝试使用Redis 2.6和新的BITCOUNT/BITOP操作在服务器端执行此操作
- 您可以检索整个字符串(包含所有位)并在客户端处理数据。在原始文章中,作者检索Redis字符串并将其转换为可以应用位级算法的Java位集。同样的策略也适用于任何客户机、任何语言:您只需找到一个好的库来处理位数组,或者自己实现一个(这并不难)。它可以与Redis 2.2或更高版本配合使用
NODE.JS不是实现CPU消耗操作的非常好的环境,但在最坏的情况下,如果您有非常大的位集,您仍然可以依赖于从NoDE.js调用的高效C++实现。你有一个好的
下面是一个Node.js示例,其中有一个非常简单(可能效率很低)的计数算法:var redis = require('redis')
var rc = redis.createClient(6379, 'localhost', {return_buffers:true} );
var bitcnt = [ 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8]
function count(b)
{
var cnt = 0
for (i=0; i<b.length; ++i ) {
cnt += bitcnt[ b[i] ]
}
return cnt
}
function fetch( callback )
{
rc.get( 'mybitset', function(err,reply) {
callback(reply)
});
}
function fill( callback )
{
rc.setbit( 'mybitset', 0, 1 )
rc.setbit( 'mybitset', 10, 1 )
rc.setbit( 'mybitset', 20, 1 )
rc.setbit( 'mybitset', 60, 1, function(err,reply) {
callback()
});
}
rc.flushall( function(err,rr) {
fill( function() {
fetch( function(b) {
console.log( "Count = ",count(b) );
});
})
})
var redis=require('redis'))
var rc=redis.createClient(6379,'localhost',{return\u buffers:true});
变量bitcnt=[ 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8]
函数计数(b)
{
var cnt=0
对于(i=0;iI如果你的redis版本不支持它,你真的很难知道ControlAltDel是正确的。无论如何,谢谢各位。我想我必须切换到2.6并解决这个问题。我添加了一个简单的示例。你能解释一下bitcnt是如何工作的吗?为什么需要它?我如何使用类似于添加相同的功能?bitcnt只是一个数组[0..255],其每个值都是索引的位数。例如bitcnt[3]=2,因为字节3上只有2位。这只是一种计算位数的简单方法,无需依赖复杂的逻辑逐位操作。使用您最熟悉的任何方法…github.com/tdegrunt/bitset的效率更低,因为它按位计数。此外,您需要找到一种转换bi的方法t将Redis输出转换为适合此包的表示形式(未提供缓冲区->位集转换)。啊,终于理解了。是的,我一直在将Redis位集转换为上面链接的js模块。再次感谢。你真的帮助我理解了这一点。:)