2012-06-25 4 views
2

저는 Node.js와 Redis를 처음 사용합니다. 이 기사를 읽고이 기사에서 언급 한대로 Express.js 앱의 모든 사용자 정보를 저장하기 위해 비트셋을 사용하려고합니다. http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/Node.js/Express.js의 Redis Bitset 작업

약간 문제가 있습니다. 내 함수에서는 현재 연도, 월 및 날짜를 ​​가져온 다음 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++; 
    } 
} 

을 또는 내가 완전히 잘못된 방법에 대해 갈거야?

+0

redis 버전에서 지원하지 않으면 실제로 수행 할 수있는 작업이 거의 없습니다. – ControlAltDel

+0

Unfortunetly ControlAltDel이 정확합니다. – freakish

+0

어쨌든 감사합니다. 2.6으로 바꾸고이 정보를 찾아야 할 것 같습니다. –

답변

2

Redis에 저장된 주어진 문자열의 비트 수를 계산해야합니다. 이 작업을 수행하는 두 가지 방법에는 기본적으로 :

  • 당신은 레디 스 2.6 새로운 BITCOUNT/BITOP 운영과 서버 측에 그것을 시도 할 수는.

  • 전체 문자열 (모든 비트 포함)을 검색하고 클라이언트 측에서 데이터를 처리 할 수 ​​있습니다. 원래 기사에서 저자는 Redis 문자열을 검색하여이를 비트 수준 알고리즘을 적용 할 수있는 Java 비트 세트로 변환합니다. 모든 클라이언트, 모든 언어에 동일한 전략을 적용 할 수 있습니다. 비트 배열을 처리하거나 직접 구현하는 좋은 라이브러리를 찾아야합니다 (그리 어렵지 않습니다). 그것은 Redis 2.2 이상에서 작동합니다.

잘 작동하지 않는 전략은 클라이언트 쪽에서 반복하고 GETBIT 명령을 실행하여 각 개별 비트를 검사하는 것입니다. 정말로 비효율적 일 것입니다.

Node.js를이 : Node.js를 가진

, 여기에 두 번째 옵션을 구현하는 데 사용할 수있는 몇 가지 리소스입니다 CPU 소비 작업을 구현할 수있는 아주 좋은 환경은 아니지만, 최악의 경우 비트 세트가 매우 큰 경우에도 여전히 효율성에 의존 할 수 있습니다 t Node.js에서 호출 할 C++ 구현 너는 boost::dynamic_bitset에 좋은 것을 가지고있다.

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} 참고 : 옵션이 있는지 레디 스 출력으로 사용되는 바이너리로 처리되고 여기에

은 아주 간단한 (그리고 아마도 비효율적 인) 계산 알고리즘과 Node.js를 예입니다 데이터 (가능한 문자 변환 무시).

+0

정말 고마워! 그것은 훌륭한 대답이었습니다. –

+0

간단한 예제를 추가했습니다. –

+0

많은 감사를드립니다. :) –