Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js/Express.js中的Redis位集操作_Node.js_Redis_Express_Bitset - Fatal编程技术网

Node.js/Express.js中的Redis位集操作

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的所有位?是否有计算位集大小的操作,以便我可以执行以

我对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或更高版本配合使用

一种不能很好地工作的策略是在客户端进行迭代,并通过执行GETBIT命令检查每个位。这将是非常低效的

对于node.js,您可能希望使用以下几个资源来实现第二个选项:

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模块。再次感谢。你真的帮助我理解了这一点。:)