복붙노트

[REDIS] 저장 32 비트 메모리 효율적인 방법은 레디 스에서 부호있는 정수

REDIS

저장 32 비트 메모리 효율적인 방법은 레디 스에서 부호있는 정수

레디 스 64 개 비트 부호있는 정수로 구문 분석 문자열을 시도하기 때문에, 32 비트의 바이너리 표현을 저장하는 좋은 아이디어 정수 대신 기수 10 정수 문자열의 서명입니까?

우리의 시스템에서 우리는 많은 32 비트 정수 ID의 목록을 가지고있다.

I can store them like
lpush mykey 102450  --> redis cast 102450 to 8 bytes long

or store it like 
lpush mykey  \x00\x01\x19\x32  ---> this is just 4 bytes

해결법

  1. ==============================

    1.내부적으로, 가장 효율적인 방식으로 레디 스를 저장하는 문자열. 기수 10 문자열로 정수를 강제로 실제로는 더 많은 메모리를 사용합니다.

    내부적으로, 가장 효율적인 방식으로 레디 스를 저장하는 문자열. 기수 10 문자열로 정수를 강제로 실제로는 더 많은 메모리를 사용합니다.

    방법은 다음과 같습니다 레디 스를 저장하는 문자열입니다 -

    당신이 인용 한 예에서, 긴 V 8 바이트 자사의 질문은 / 문자열을 21 바이트이야.

    편집하다 :

    그것은 당신이 얼마나 많은 요소에 따라 달라집니다.

    당신이 당신의 세트 미만 512 개 요소가있는 경우, 다음 세트가 IntSet로 저장됩니다 (SET-MAX-intset-항목 참조). IntSet은 정렬 된 정수의 배열에 대한 영광 이름입니다. 당신의 숫자가 적은 10000보다 때문에, 요소 당 16 비트를 사용합니다. 이것은 C 어레이와 같은 효율적인 메모리로서 (거의)이다.

    이상의 512 개 요소가있는 경우, 세트는 해시됩니다. 세트의 각 요소는 16 바이트의 오버 헤드가 robj 불리는 구조에 싸여있다. 당신은 정수 자체가되지 지불 아무것도 추가를 할 수 있도록 robj 구조는 정수의 공유 풀에 대한 포인터를 가지고있다. 그리고 마지막으로, robj 인스턴스 해시 테이블에 저장되고, 해시 테이블 세트의 크기에 비례하는 오버 헤드를 갖는다.

    당신은 당신의 데이터 세트에 정확히 얼마나 많은 메모리 요소 소비하는 실행 레디 스-RDB-도구에 관심이 있다면. 아니면 클래스 MemoryCallback에 대한 소스 코드를 읽을 수, 코멘트 메모리가 배치되는 방법을 설명합니다.

  2. ==============================

    2.이 데이터베이스에 단 4 바이트되지 않도록 문자열은 길이가 저장되어 - 아마 당신은 아무것도 얻을하지 않도록 + 4는 길이 + 패딩 바이트 4 바이트의 데이터로 저장합니다.

    이 데이터베이스에 단 4 바이트되지 않도록 문자열은 길이가 저장되어 - 아마 당신은 아무것도 얻을하지 않도록 + 4는 길이 + 패딩 바이트 4 바이트의 데이터로 저장합니다.

  3. from https://stackoverflow.com/questions/16137927/memory-efficient-way-to-store-32-bit-signed-integer-in-redis by cc-by-sa and MIT license