2012-07-01 2 views
5

Redis은 내가 사용하는 기존의 SQL 데이터베이스와 개념적으로 다르고 내 프로젝트에 맞는지 알아 내려고 노력하고 있습니다 ... 주위를 둘러 보았지만 찾을 수없는 것 같습니다. 내 질문에 대한 대답.Redis 및 값 쿼리

고유 ID 및 각 값과 연관된 여러 값 (예 : 이름)을 저장해야하는 사용자 집합이 있습니다.

message:1a7bcba4849b4c281bfef98a952dcfeb 
"sender" "fef982dcfe1a7bcba4849b4c281bba95" "recipient" "82dcfe1a7bcba4849b4c281bba95fef9" "message" "Hi!" 

: 나는 또한 내가, 각각은 발신자와 수신자 등의 몇 가지 특성을 갖는 저장하려는 메시지의 무리가

user:fef982dcfe1a7bcba4849b4c281bba95 
"username" "andrewm" "name" "Andrew" 

: 나는 단순히 해시로 사람들을 저장할 수있는 것 같다 내 질문은 특정 사용자가 보낸 모든 메시지를 검색하는 방법 (해시 지정)입니다. 대신에 기존의 관계형 데이터베이스 또는 MongoDB와 같은 NoSQL 데이터베이스 (이전에 사용했던 데이터베이스)를 사용해야합니까? 그렇다면 누구나 고성능 매장에 대한 제안 사항이 있습니까? 나는 진실한 검색 (즉, MySQL LIKE 쿼리)을 수행하지 않을 것입니다. 단지 핵심 가치 조회입니다.

답변

7

Redis를 사용하여 이러한 데이터를 모델링 할 수는 있지만 데이터 구조 및 액세스 경로를 고려해야합니다. Redis를 사용하면 액세스 경로가 암시 적으로 관리되지 않습니다 (예 : RDBMS/MongoDB의 인덱스 사용). 제공된 예를 들어

, 당신은 할 수 : 전송 및 * : 추가/삭제의 상단에서 보낸 사람과받는 사람에 해당 세트를받은

user:<user hash> -> hash of user properties 
user:<user hash:sent -> set of <msg hash> 
user:<user hash>:received -> set of <msg hash> 
message:<msg hash> -> hash of message properties 

는 추가/메시지를 삭제하면 *를 유지하는 것을 의미한다 메세지 오브젝트 자체 사용하는 방법에 대한 이론적 근거를 들어

# Get a list of message hash codes only in one roundtrip 
smembers user:<user hash>:received 

# Get a list of message contents in one roundtrip 
sort user:<user hash>:received by nosort get message:*->sender get message:*->message 

: 당신은 같은 시간에 메시지의 속성을 검색 할 경우 해당 사용자에 대해주고받은 메시지를 가져

그냥 SMEMBERS 명령 또는 일종이다 정렬을 참조하십시오

참고 1 :Redis와 함께 정수는 UUID 또는 해시 코드 (특히 세트)보다는 키로 사용하는 것이 더 효율적입니다. 더 효율적인 방법으로 저장되기 때문입니다.

참고 2 : 메시지를 주문해야하는 경우 세트 대신 목록을 사용해야합니다. 결과는 가장 오래된 메시지 만 제거 할 수 있으며 효율적인 메시지로 새 메시지 만 추가 할 수 있습니다. 모든 메시지에 대해 전체 목록을 추가하는 것이 좋습니다.

+0

설명에 감사드립니다. 매우 도움이되었습니다. 더 자세히 살펴 보겠습니다 :) –

+0

안녕, 고마워, 매우 도움이. "메시지 추가/삭제가 * : sent 및 * : received set 유지"를 의미하는 경우 데이터를 저장하기 위해 더 많은 공간이 필요하며 메모리에서 더 많은 공간을 차지합니까? 이런 종류의 "멀티 스토어"가 자주 수행된다면 성능에 문제가 될 수 있습니까? 도움 주셔서 감사합니다 – Loic

+0

예, 저장할 더 많은 데이터를 나타냅니다. 성능과 관련하여 파이프 라이닝을 사용하여 주어진 작업에 대해 여러 명령을 수행 할 때의 영향을 상쇄해야합니다. http://redis.io/topics/pipelining을 참조하십시오. –