2012-04-11 4 views
6

키의 고유 사용자 이름을 사용하는 것보다 사용자 ID를 사용하면 어떤 이점이 있는지 궁금합니다.Redis의 키 사용자 이름 또는 ID

  • 사용자 : USERNAME => {암호 : HASH, 연령 : 45}
  • 사용자 : 0 => {사용자 이름 : 사용자 이름, 암호 : HASH, 연령 : 45}

참고 I 이름으로 사용자를 조회하기를 원하므로 사용자 이름을 ID와 관련시키기 위해 두 번째 키 - 값 세트가 필요합니다.

모든 사용자 이름이 고유하고 영숫자 여야한다는 점을 감안할 때 ID 시스템을 사용하는 것이 유익 할 수있는 특별한 이유가 있습니다.

제가 주로 묻는 이유는 데이터베이스가 특정 방식으로 표준화되었을 때 데이터베이스에서 조회 시간이 줄어들어 주로 ID를 사용했기 때문입니다. 하지만 Redis는 이러한 이점을 얻지 못했고 사용자 이름 대신 사용자 ID를 사용해야하는 다른 이유가 있는지 궁금했습니다. 어떤 도움

감사합니다,

Pluckerpluck

추신 Redis가 해시를 처리하는 방식으로 인해 두 가지 방법의 메모리 차이에 대해 실제로 확신 할 수 없으므로이 정보는 나중에 테스트하고 나올 수도 있지만 좋을 수 있습니다.

답변

13

정의한 유스 케이스에서는 중요하지 않지만 정수형 사용자 ID를 사용하면 다른 장점이 있습니다.

조만간 다른 개체에서 사용자 ID를 참조 할 수 있습니다. 예를 들어, "사용자 pluckerpluck의 친구".

friendsof:pluckerpluck -> SET{tom, dick, harry}

VS

friendsof:1 --> SET{2, 3, 4}

전자의 방법은 요소를 저장하기 위해 정기적 해시 테이블을 사용하고, 메모리를 많이 사용합니다 - 그 모델하려면 두 가지 대안이있을 것이다. 후자의 접근법은 정수 배열을 사용하며 매우 효율적입니다.

정수 집합에 대한 특수 인코딩을 IntSet이라고합니다. 속성을 사용하여 Redis의 동작을 제어 할 수 있습니다. set-max-intset-entries

# Sets have a special encoding in just one case: when a set is composed 
# of just strings that happens to be integers in radix 10 in the range 
# of 64 bit signed integers. 
# The following configuration setting sets the limit in the size of the 
# set in order to use this special memory saving encoding. 
set-max-intset-entries 512 
+0

해당 시나리오를 지적 해 주셔서 감사합니다. 그냥 간단한 질문 : ID를 사용한다면. 그런 다음 사용자 이름을 검색 할 수 있도록 username-id 관계가 필요합니다. 정렬 된 집합 (ID가되는 순위)이이를 수행하는 좋은 방법이라고 생각하십니까? 아니면 해시 대신? – Pluckerpluck

+2

해시는 다음 두 가지 이유로 더 좋습니다. a) 정렬 된 집합보다 적은 메모리를 사용합니다. b) 사용자의 순서가 정의되어 있지 않으므로 개념적으로 정렬 된 집합을 사용하는 것이 적합하지 않습니다. –

+0

사용자 이름을 색인화하기 위해 해시를 사용합니다. 그들은 메모리에서 zset보다 훨씬 더 작습니다. zset을 사용하면 이름에 대한 범위 쿼리를 지원해야하는 경우에만 유용 할 것입니다 ... –

관련 문제