2017-01-22 5 views
0

Elasticache Redis 노드를 사용하여 데이터를 저장합니다.키/값 쌍이 Redis에 저장되는 방법

모든 키의 형식은 같습니다.
- 키는 md5 해시 - 128 비트 (16 바이트, 32 문자열 바이트)입니다.
- 값은 시간 소인 문자열 - 19 바이트입니다.
총 키 크기는 32+19=51 bytes

입니다. 84 917 361 만 개의 키가 있습니다.
Redis 셸에서 사용하는 총 메모리는 84917361*51 = 4.03 gb에 가깝다고 가정합니다.

실제로는 11.07 gb이 필요합니다. info 명령의
출력 : 메모리, 7 gb의 나머지를 지출 내용에 used_memory_human:11.07G

  1. ?
  2. md5을 32 바이트 문자열이 아닌 16 바이트 해시로 저장할 수 있습니까?

감사합니다. 도움을 주시면 매우 감사하겠습니다.

+0

[이 기사] (https://redis.io/topics/memory-optimization), 특히 키 대 해시의 메모리 영향에 관한 부분에 관심이있을 수 있습니다. –

+0

감사합니다. @Kevin Christopher Henry, 제안을 구현할 것입니다. – antonbormotov

답변

1

사용 된 메모리 잔량은 7GB입니까?

짧은 대답 : Redis는 키와 값을 원시 문자열으로 저장하지 않습니다. 사실

,

  1. 키가 sdshdr 구조로 싸여 오버 헤드를 가지고, 예를 들어 (최신 버전, 그것보다 컴팩트 한 구조이다) 캐릭터 라인의 길이

  2. 값은 redisObject 구조로 래핑되고, 또한 약간의 오버 헤드를 갖는다. 객체 인코딩, refcount.

  3. Redis가 dict에 쌍을 삽입하면 다른 오버 헤드가 발생합니다 (예 : next 포인터 및 구조의 key 포인터

이러한 오버 헤드로 인해 나머지 메모리가 소모됩니다. 위해

는 @Kevin 크리스토퍼 헨리가 언급 한 기사 (작은 해시 redisObject 오버 헤드가 많이 저장할 수 있으며, 메모리의 요소가 더 컴팩트하게 ziplist를 사용할 수 있음)를 참조 할 수 있습니다, 그것의 더 많은 메모리를 효율적으로 만들 수 있습니다.

md5를 32 바이트 문자열이 아닌 16 바이트 해시로 저장할 수 있습니까?

각 MD5 문자열에 대한 다이제스트를 생성하는 등 Murmurhash 등의 해시 함수를 사용합니다.

이렇게하면 8 바이트 (64 비트)의 다이제스트를 얻을 수 있습니다. 그러나 Murmurhash 다이제스트에서 원시 md5 문자열을 가져올 수 없습니다. 그래서 만약 당신이 DO 을하지 않는다면 md5의 값을주의하십시오, 당신은이 방법을 취할 수 있습니다.

+0

감사합니다. @ for_stack, 그게 내가 찾고 있던 것입니다. 나는 해머 값으로'Murmurhash' 또는'crc32'를 사용하려고 노력할 것입니다. – antonbormotov