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를 예입니다 데이터 (가능한 문자 변환 무시).
redis 버전에서 지원하지 않으면 실제로 수행 할 수있는 작업이 거의 없습니다. – ControlAltDel
Unfortunetly ControlAltDel이 정확합니다. – freakish
어쨌든 감사합니다. 2.6으로 바꾸고이 정보를 찾아야 할 것 같습니다. –