Node.js / Express.js中的Redis Bitset操作

我对Node.js和Redis非常陌生。 我阅读这篇文章,并且想要使用一个bitset存储我的Express.js应用程序的所有用户信息,如本文所述: http : //blog.getspool.com/2011/11/29/fast-easy-实时度量-使用-redis的位图/

我有点麻烦 在我的函数中,我得到当前的年份,月份和date,然后使用client.setbit()来设置适当的键和值。 但是我怎么算所有的钥匙? 我在Redis 2.4 *上,BITCOUNT命令在2.6。 有没有其他的方法? 本文使用Java位集,所以这是一个不同的东西。 我不太明白。

我怎么可以使用,例如for循环,计数所有的位设置为1? 有什么操作来计算位集的大小,所以我可以做这样的事情:

for (var i = initial_offset; i < bitset_length; i++){ if (i == 1){ total_users++; } } 

还是我以一种完全错误的方式去做呢?

您需要计算存储在Redis中的给定string的位数。 基本上有两种方法可以做到这一点:

  • 您可以尝试在服务器端使用Redis 2.6和新的BITCOUNT / BITOP操作。

  • 您可以检索整个string(包含所有位)并在客户端处理数据。 在原始文章中,作者检索Redisstring并将其转换为可以应用位级algorithm的Java位集。 任何客户端,任何语言都可以应用同样的策略:你只需要find一个好的库来处理比特数组,或者自己实现一个(这并不困难)。 它可以与Redis 2.2或更高版本兼容。

一个不太好的策略是在客户端进行迭代,并通过执行GETBIT命令来检查每个单独的位。 这将是非常低效的。

使用node.js,下面是一些您可能想用来实现第二个选项的资源:

Node.js并不是一个很好的实现CPU消费操作的环境,但是在最坏的情况下,如果你有很大的位集,你仍然可以依靠一个有效的C ++实现来从Node.js中调用。 你有一个很好的boost :: dynamic_bitset 。

下面是一个Node.js例子,它有一个非常简单的(也可能是效率很低的)计数algorithm:

 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) ); }); }) }) 

请注意{return_buffers:true}选项用于确保Redis输出被处理为二进制数据(忽略可能的字符转换)。

Interesting Posts