2014-11-23 4 views
1

Redis를 배우고 있으며 간단한 users 테이블로 작업하고 있습니다. 나는을 통해 레디 스와 상호 작용하고 있습니다. 사용자 조회 테이블에 Redis 사용

내가 좋아하는 각각의 새로운 사용자 저장 :

user_ids 
1 
2 

그리고

user:1 username 'Guy One' 
user:2 username 'Guy Two' 

이 잘 작동 :이 시점에서 그래서

client = redis.createClient(); 
client.incr('user_count', function (err, reply) { 
    var new_user_id = reply; 
    client.lpush('user_ids', new_user_id); 
    client.hset('user:' + new_user_id, 'username', req.param('username'), redis.print); 
    client.quit(); 
    res.redirect('/'); 
}); 

를, 내가 좋아하는 내 데이터베이스를 볼 것으로 예상 .하지만 지금 내가 붙어있는 것은 전체 사용자 테이블을 생성하는 것입니다. user_ids을 반복하고 각각에 대해 해당 user 해시 항목을 추출합니다.

매우 비효율적 인 (각 사용자 키에 대한 개별 쿼리) 것 외에도이 접근법은 node_redis getter 호출이 비동기 적으로 수행되기 때문에 문제가됩니다. 따라서 각 getter는 성공 콜백에서 다음 getter를 호출해야합니다. A 매우 중첩 콜백 게터의 긴 체인.

내가 처음 시도했던 것입니다 : 위에서 언급 한 바와 같이,뿐만 아니라 비효율적이지만 작동하지 않습니다,

var usernamesList = new Array(); 
client.lrange('user_ids', 0, -1, function (err, reply) { 
    var userIdsList = (reply == null || reply == undefined) ? new Array() : reply; 
    for (var userId in userIdsList) { 
     usernamesList.push(client.hget('user:' + userId, 'username')); 
    } 
    res.render('users', { usernames: usernamesList }); 
}); 

을하지만 때문에 세 번째 매개 변수 (현재 존재하지 않는)에 hget()있어서 실제로 등

다음 userIdsList에서 다음 항목 hget() 호출해야 콜백, hget()의 부울 값인 리턴 값이어야한다. 그래서 [true, true]

내 질문 :

  1. 이 수행 할 수있는 올바른 방법/건축가 전체 사용자 목록 및 조회 된 결과, 내 방법은 간단의 배열을 반환 위의 기록으로?

  2. hget()에 콜백이 필요하다는 사실을 어떻게 처리 할 수 ​​있습니까? 모든 사용자 이상

답변

1

반복하기를 user_ids의 길이만큼 왕복을 필요로 이런 식으로. Redis 클러스터를 사용하지 않으려는 경우 MULTI/EXEC을 사용하여 이러한 모든 명령을 한 번에 보내고 결과를 단일 응답으로 되돌려 보낼 수 있습니다.

client.lrange('user_ids', 0, -1, function (err, users) { 
    var userIds = users || [], 
     pipeline = []; 
    userIds.forEach(function (userId) { 
     pipeline.hget('user:' + userId, 'username'); 
    }); 
    pipeline.exec(function (err, users) { 
     res.render('users', { usernames: users); 
    }); 
}); 

사용자 테이블이 단일 필드 (사용자 이름)로 구성된 경우 단일 해시를 사용하여 모든 사용자를 저장할 수 있습니다.

설정 :

client.incr('users_count', function (err, count) { 
    client.hset('users', count, req.param('username')); 
}); 

찾기 :

client.hgetall('users', function (err, users) { 
    res.render('users', users); 
}); 

또 다른 방법은 루아 스크립트를 사용하지만 사용자 키가 조회 할 수 있기 때문에 그는 레디 스 클러스터와 잘 재생되지 않습니다 동적으로 생성되며 클러스터는 서버가 액세스하는 모든 키가 동일한 redis 인스턴스에 있어야합니다.

관련 문제