레이블이 프로그래밍인 게시물을 표시합니다. 모든 게시물 표시
레이블이 프로그래밍인 게시물을 표시합니다. 모든 게시물 표시

2015년 9월 4일 금요일

Redis 설정과 랭킹처리(node.js)

redis용 npm 모듈을 설치한다.

  npm install redis


레디스 서버와 연결한다.

var redis = require('redis');
var client = redis.createClient("6379", "192.192.0.0");
client.on('connect', function() {
    //console.log('connected');
});

redis.createClient("6379", "192.192.0.0")
레디스 포트는 설정을 바꾸지 않는한,  "6379"번을 사용한다.
redis.createClient("포트", "레디스서버 IP")
이다.


점수를 추가한다

var board = "leaderboard";
var score = 13;
var id = "blaknwhite";
client.zadd(board, score, id, function(err, reply){
    if(err){
        console.log("error");
        return;
    }else{
        console.log("ranking : " + reply);
    }
});

client.zadd(board, score, id, function(err, reply)
board는 키값이다. 이 키값으로 랭킹그룹을 구분한다.
예를 들어 12번 스테이지의 랭킹그룹과 13번 스테이지의 랭킹그룹을 가지고 싶다면 키값을
"stage12"와 "stage13"으로 설정하여 그룹을 나눌 수 있다.
score는 점수를 넣는다.
id에는 유저id를 넣는다.
function(err, reply)는 콜백 함수로서, 에러가 발생하면 err에 값이 있게 되고, 정상적일때는 reply에 rank값이 들어있다.
이때의 rank는  작은값을 0으로 sort 했을때(오름차순)의 값이다.

예를 들어 id(score) 가
  black1(10) ---- 0
  black2(22) ---- 1
  black3(34) ---- 2
라면 black1의 rank는 0,black3는 2 가 된다.

만약 내림차순으로 얻으려면( black3의 랭킹이 0)

client.zrevrank( board, save_data_id, function(err, reply){
});

을 사용한다.

두개의 command를 동시에 실행한다

만약 점수를 추가하면서 zrevrank의 값을 얻어 오려면, 두개의 command를 동시에 실행하는
multi를 사용하면 된다.

var multis = client.multi();
multis.zadd( board, score, id);
multis.zrevrank( board, id);
multis.exec(function(err, re){
    if(err){
        console.log("error");
        return;
    }else{
        console.log("ranking : " + re[1]);
    }
});

콜백함수의 re에는 값이 배열 형식으로 들어가 있다
 re[0] -> zadd의 return값
 re[1] -> zrevrank의 return값


랭킹리스트를 가져온다

내림차순으로 0등부터 2등까지를 점수와 함께 가져오고 싶다면

var board = "leaderboard";
var start= 0;
var end = 2;
client.ZREVRANGE(board, start, end, 'WITHSCORES', function(err, reply){
    if(err){
        console.log("error");
        return;
    }else{
        var count = reply.length;
        var j =0;
        for(var i=0; i < count; i+=2 ){
            console.log("ID : "  + reply[i]);
            console.log("Score : "  + reply[i+1]);
        }
    }
});

예를 들어 id(score) 가
  black1(34) ---- 0
  black2(22) ---- 1
  black3(17) ---- 2
  black4(11) ---- 3
일때
 
client.ZREVRANGE(board, start, end, function(err, reply) 라면
reply[0] -> black1
reply[1] -> black2
reply[2] -> black3
이 된다.

점수도 같이 표시되는
client.ZREVRANGE(board, start, end, 'WITHSCORES', function(err, reply) 라면
reply[0] -> black1
reply[1] -> 34
reply[2] -> black2
reply[3] -> 22
reply[4] -> black3
reply[1] -> 17
이 된다.