2011-04-14 3 views
7

나는 새내기를 원하며, 몇 백만 회원 ID, 이메일 및 사용자 이름의 데이터 세트를 가지고 있으며, 예를 들어 목록 구조에 저장하려고 생각하고 있습니다. 내 생각에 listsorted set이 가장 적합 할 것 같습니다.redis 구조, 성능

지금은 사용자 이름의 첫 글자를 사용하여 목록에 색인을 만들고 데이터를 다시 목록으로 푸시합니다 : rpush list:name:a username,member_id. 그러나 목록이 정렬되지 않았으므로 수백만 개의 항목에서 특정 레코드를 검색하는 속도가 느립니 까?

정렬 된 집합 (이 때문에 정렬 됨)이이 경우 목록보다 우수할까요? 또는 성능 향상을위한 다른 권장 사항이 있습니까?

레코드에 액세스하는 열쇠는 사용자 이름과 전자 메일이어야합니다.

답변

14

색인 앞 또는 끝에 있지 않은 색인을 사용하면 비용이 많이 들며 O (N)가됩니다. 큰 목록의 경우 이는 그리 효율적이지 않습니다.

필요에 따라 해시를 사용하는 것이 더 적합 할 수 있습니다. 이것은 목록보다 많은 메모리를 사용하지만 거의 O (1) 액세스를 제공합니다.

redis의 해시는 임의의 필드와 값을 포함 할 수있는 명명 된 키입니다.

전체 사용자 레코드를 member_id를 사용하여 명명 된 단일 redis 해시에 저장할 수 있습니다 (이 값은 짧은 값이기를 바랍니다). "42 사용자"는 MEMBER_ID가 사용자 별 고유 보장, 여기 MEMBER_ID (42)

hset user:42 email [email protected] 
hset user:42 username foobar 
hset user:42 logincount 0 

레디 스 "키 이름"여기에 사용자의 해시를 채우는 방법이다. 각 사용자는 SQL 데이터베이스의 단일 행과 유사한 단일 키를 얻지 만보다 유연합니다. 그런 다음 두 개의 보조 해시를 업데이트 할 수 있습니다. 하나는 사용자 이름을 member_id에 매핑하고 다른 하나는 전자 메일 주소를 member_id에 매핑하는 것입니다. 이것은 member_id, 사용자 이름 및 전자 메일 주소 사이에 1 : 1 관계가 있다고 가정합니다.

hset username_to_id foobar 42 
hset email_to_id [email protected] 42 

당신이, 당신이 첫 번째 키 사용자의 해시에서 email 필드를 검색 한 후 email_to_id 해시에서 MEMBER_ID를 검색하고 특정 사용자의 이메일 주소를 조회해야

: 마찬가지로 MEMBER_ID, 당신 사용자 이름으로 시작하여 username_to_id 해시의 member_id를 조회 한 다음 사용자에 저장된 사용자 레코드 : member_id 해시로 이동할 수 있습니다. " 사용자"해시

redis> hget email_to_id [email protected] 
"42" 
redis> hget user:42 username 
"foobar" 
redis> 

당신은 더 많은 필드를 추가하여 사용자에게 더 레코드를 추가 할 수 있습니다 : 여기

는 이메일 주소를 주어진 이름을 찾는 예이다. 당신이 로그인 카운터를 증가하려면, 그뿐만 아니라 간단합니다 : 당신은 redis.io 사이트에서 more information about hashes을 찾을 수 있습니다

redis> hincrby user:42 login_count 1 
(integer) 1 
redis> hgetall user:42 
1. "email" 
2. "[email protected]" 
3. "username" 
4. "foobar" 
5. "login_count" 
6. "1" 
redis> 

.

+0

감사합니다. 하지만 설정 또는 정렬하지 왜 설정 – Leon

+0

하지만 1m의 사용자 thats 뜻은 1m 해시 id, u는 특정 얻을 때, 그것은 성능을 줄일 것인가? – Leon