2012-07-01 3 views
4

redis를 사용하여 웹 응용 프로그램의 사회 스트림과 알림 시스템을 구현하고 있습니다. 나는 새로 만들기에 해롭고 해시와 효율성에 대해 약간의 의구심을 가지고 있습니다.redis - 해시 사용

나는이 awakeome Instagram post 을 읽었으며 최소한의 저장을 위해 유사한 솔루션을 구현할 계획이었습니다. 자신의 블로그에서 언급 한 바와 같이

, 그들은 해시 유형을 활용하려면이

좋아했다, 우리는 1000 버킷으로 우리의 모든 미디어 ID를 버킷 (우리는 단지 1000에 의해 ID, 분열을 폐기 나머지). 그것은 우리가 어느 열쇠에 빠지는지를 결정합니다. 다음으로 해당 키에있는 해시 내에서 미디어 ID는 내에서 내의 해시 키이며 사용자 ID는 값입니다. 하나 1,000 별도 키 그들이 저장되는 데 너무 대신

HSET "mediabucket:1155" "1155315" "939" 
HGET "mediabucket:1155" "1155315" 
> "939" 

: 그것은 버킷 1,155 (1,000분의 1,155,315 = 1,155)에 속하는 수단 1,155,315의 미디어 ID 주어진 예, 1000 개의 조회 키가있는 해시. 그리고 제 의심의 여지가 인 이유는 조회 키 값을 더 크게 늘릴 수 없기 때문입니다.

예 :Media ID of 1155315 will fall into mediabucket:115 by dividing it by 10000 또는 그 이상.

왜 그들은 1000 개의 조회 키가있는 하나의 해시 버킷으로 정착하고 있습니다. 왜 그들은 해시 버킷에 100000 개의 조회 키을 가질 수 없습니까? 그게 효율성과 관련이 있습니까?

내 웹 응용 프로그램에서 효율적인 방법을 구현하기위한 제안이 필요합니다.

P. 부디! stackoverflow는 제안을 요청하는 것이 아니며 어디에서 도움을 얻을 수 있는지 모른다.

감사합니다.

답변

6

예, 효율성과 관련이 있습니다.

우리는 Redis의 핵심 개발자 중 한 명인 Pieter Noordhuis에게 의견을 물었습니다. 그는 Redis 해시를 사용할 것을 제안했습니다. Redis의 해시는 매우 효율적으로 메모리에 인코딩 될 수있는 사전입니다. Redis 설정 'hash-zipmap-max-entries'는 여전히 해시가 효율적으로 인코딩되는 동안 가질 수있는 최대 항목 수를 구성합니다. 우리는이 설정이 최고 1000 주위에있는 것을 발견했습니다. 상위 명령과 HSET 명령은 눈에 띄는 CPU 활동을 유발합니다. 자세한 내용은 zipmap 소스 파일을 확인하십시오.

작은 해시가 특별한 방법 (zipmaps)으로 인코딩되며, 그 메모리 효율적이지만 작업 O (N)을 만드는 대신 O (1). 따라서 1 개의 필드가있는 100 개의 지퍼 맵 대신 100,000 개의 필드가있는 zipmap을 사용하면 메모리 이점은 없지만 모든 작업은 100 배 더 느려집니다.

+0

감사합니다. 그래서 1000에 갈 것입니다. – rnk

2

기본적으로 단일 해시에 저장된 값의 수는 1000을 초과하지 않아야합니다. 아마도이 숫자 (해당 집합 hash-zipmap-max-entries)로 제대로 작동하도록 Redis 인스턴스 구성을 설정합니다.

해시가 지정된 요소 수 또는 지정된 요소 수를 초과 할 때마다 실제 해시 테이블로 변환되고 메모리 절약 효과가 손실됩니다.

-http://redis.io/topics/memory-optimization

내가 알고있는 것처럼, 당신의 질문은 "왜 정확히 1,000 아니라 더?"입니다 우주 효율과 속도 중 하나를 선택해야했기 때문입니다. 공간 효율적인 표현은 정상적인 해시처럼 O(1)이 아닌 연산 복잡도가 O(N)이고 N 시간이 느림이지만 메모리가 적습니다.

다른 값을 테스트 한 결과 1000이 좋은 해결책이라는 것을 알았습니다. 공간은 많이 차지하지 않지만 충분히 빠릅니다.

+0

고마워요, 그래서 1000에 갈 것입니다. – rnk

+1

@rnk 여러분의 작업에 가장 적합한 값을 테스트 할 수 있습니다. – scriptin

관련 문제