2017-04-27 4 views
1

두 시나리오에서 redis의 메모리 크기를 계산하려고했습니다.해시 맵과 문자열 키의 Redis 메모리 최적화

시나리오 1 :이 시나리오에서

String commonString = "Test"; 
    long commonId = 1234567890L; 
    int size = 0; 
    for(int i = 1; i <= 100; i++) 
    { 
     jedis.hset((commonString+"_"+commonId).getBytes(),SafeEncoder.encode("KEY_"+i),("Value_"+i).getBytes()); 
    } 
    DebugParams debugParams = DebugParams.OBJECT(commonString+"_"+commonId); 
    String debugged = jedis.debug(debugParams); 
    size = Integer.parseInt(debugged.split(":")[4].split(" ")[0]); 

,이 925 바이트를 얻어이 시나리오에서는

String commonString = "Test"; 
    long commonId = 1234567890L; 
    int size = 0; 
    for(int i = 1; i <= 100; i++) 
    { 
     jedis.set((commonString+"_"+commonId+"_KEY_"+i).getBytes(),("Value_"+i).getBytes()); 
     DebugParams debugParams = DebugParams.OBJECT(commonString+"_"+commonId+"_KEY_"+i); 
     size += Integer.parseInt(debugged.split(":")[4].split(" ")[0]); 
    } 

은 크기가 892 바이트

시나리오 2

이다.

Redis 2.2 이후 많은 데이터 유형이 특정 크기까지 더 적은 공간을 사용하도록 최적화되었습니다. 해시, 목록, 정수로 구성된 집합 및 정렬 된 집합 (주어진 요소 수보다 작고 최대 요소 크기까지)은 메모리를 최대 10 배나 적게 사용하는 매우 효율적인 방식으로 인코딩됩니다 (5 시간 절약 적은 메모리 사용 평균 저장).

나는이 최적화를 시도했지만 그것을 성취하지 못했습니다. 구성은 기본 구성입니다. 무엇이 잘못되었을 수 있습니까?

편집 인포의

시나리오 1 시나리오 1에서

String commonString = "Test"; 
    long commonId = 1234567890L; 
    jedis.flushAll(); 
    String info1 = jedis.info(); 
    for(int i = 1; i <= 75; i++) 
    { 
     jedis.set(commonString+"_"+commonId+"_KEY_"+i, "VALUE_"+i); 
    } 
    String info2 = jedis.info(); 

사용 메모리 "used_memory : 844640"이고, 정보 2에 사용 된 메모리 것은 "852,176 used_memory"이다. 따라서 info2와 info1의 차이는 7536 바이트입니다.

시나리오 2 시나리오 2에서

String commonString = "Test"; 
    long commonId = 1234567890L; 
    jedis.flushAll(); 
    String info1 = jedis.info(); 
    for(int i = 1; i <= 75; i++) 
    { 
     jedis.hset(commonString+"_"+commonId,"KEY_"+i,"VALUE_"+i); 
    } 
    String info2 = jedis.info(); 

, 인포에서 사용되는 메모리가 "used_memory : 845576"이고, 정보 2에서 사용하는 메모리 "847,208 used_memory"이다. 따라서 info2와 info1의 차이는 1632 바이트입니다.

정확하게 평가 했습니까? 당신이 문서에 대한 DEBUG OBJECT를 참조하면

답변

1

, 당신은 배울 것이다 :

디버그 개체는 클라이언트에서 사용할 수 없습니다 디버깅 명령입니다. 대신 OBJECT 명령을 확인하십시오.

DebugParams.OBJECT에서 되돌아 오는 것은 무엇이든간에 당신이 달성하려고하는 것과 전혀 관련이없는 경우가 대부분입니다.

좋은 소식은 Redis v4가 새로운 MEMORY (Doctor) 명령을 소개한다는 것입니다. 다음은 @antirez's 'The first release candidate of Redis 4.0 is out'의 발췌 부분입니다.

6. 새로운 MEMORY 명령.

메일 링리스트 에 "My Redis is slow"라는 문구를 잘라내어 소개 한 LATENCY DOCTOR가 아주 좋아합니다.이제 우리는 기억 문제에 대해서도 그것을 가지고 있습니다.

127.0.0.1:6379> MEMORY DOCTOR 
Hi Sam, this instance is empty or is using very little memory, my issues detector can't be used in these conditions. Please, leave for 

지구에서의 임무를 확인하고 데이터를 입력하십시오. 새 Sam과 I 은 재부팅하자마자 프로그래밍으로 돌아갑니다.

영화 저작권자는 SF 대화의 영감을 얻기 위해 나를 고소 할 것이지만 괜찮습니다. 교도소에 이있을 때 오렌지를 가져 오십시오.

메모리가 그 이상입니다.

127.0.0.1:6379> MEMORY HELP 
1) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key" 
2) "MEMORY STATS       - Show memory usage details" 
3) "MEMORY PURGE       - Ask the allocator to release memory" 
4) "MEMORY MALLOC-STATS     - Show allocator internal stats" 

대해 USAGE 하위 명령의 메모리 사용량보고

는 매우 유용 할 것, 또한 "통계"에서 제공하는 깊이 정보입니다.

지금은이 모든 것이 완전히 문서화되지 않았기 때문에 재미가 무엇인지 알아 냈습니다.

+0

나는 redis-3.2.8을 사용하고 있습니다. 시나리오 1과 시나리오 2에서 취한 정확한 메모리를 어떻게 알 수 있습니까? –

+0

1) 다시 설정 재설정 2) INFO 메모리에서 기준선 가져 오기 3) 상당한 양의 동일한 키 만들기 4) 다른 판독 값 가져 오기 5) 각 실험마다 반복하고 비교하십시오. 부정확하지만 v4 이전에 할 수있는 최선의 방법. –

+0

편집 된 버전이 맞습니까? –