sql >> Database teknologi >  >> NoSQL >> Redis

Hukommelseseffektiv måde at gemme 32 bit signeret heltal i Redis

Internt opbevarer Redis strenge på den mest effektive måde. At tvinge heltal ind i radix 10 strenge vil faktisk bruge mere hukommelse.

Her er, hvordan Redis gemmer Strings -

  1. Heltal mindre end 10.000 er gemt i en delt hukommelsespulje og har ingen hukommelsesomkostninger. Hvis du ønsker det, kan du øge denne grænse ved at ændre konstanten REDIS_SHARED_INTEGERS i redis.h og genkompilere Redis.
  2. Heltal større end 10.000 og inden for rækkevidde af en lang forbruge 8 bytes.
  3. Regulære strenge tager len(streng) + 4 bytes for længde + 4 bytes til markering af ledig plads + 1 byte for nulterminator + 8 bytes for malloc-overhead.

I det eksempel, du citerede, er det et spørgsmål om 8 bytes for en lang v/s 21 bytes for strengen.

EDIT:

Så hvis jeg har et sæt tal, der alle er mindre end 10.000, hvordan gemmer Redis mit sæt?

Det afhænger af, hvor mange elementer du har.

Hvis du har mindre end 512 elementer i dit sæt (se set-max-intset-entries ), så vil sættet blive gemt som et IntSet. Et IntSet er et glorificeret navn for en Sorted Integer Array. Da dine tal er mindre end 10.000, ville det bruge 16 bits pr. element. Det er (næsten) lige så hukommelseseffektivt som et C-array.

Hvis du har mere end 512 elementer, bliver sættet til en HashTable. Hvert element i sættet er pakket ind i en struktur kaldet robj , som har en overhead på 16 bytes. robj struktur har en pointer til den delte pulje af heltal, så du betaler ikke noget ekstra for selve heltal. Og til sidst, robj forekomster gemmes i hashtabellen, og hashtabellen har en overhead, der er proportional med størrelsen af ​​sættet.

Hvis du er interesseret i præcis, hvor meget hukommelse et element bruger, så kør redis-rdb-tools på dit datasæt (disclaimer:Jeg er forfatteren til dette værktøj). Eller du kan læse kildekoden til klassen MemoryCallback, kommentarerne forklarer, hvordan hukommelsen er lagt ud.



  1. Inde i Santanders Near Real-Time Data Ingest Architecture

  2. Hurtig referencevejledning til forskellige NoSQL-databaser

  3. Fejl:queryTxt ETIMEOUT ved forbindelse til MongoDb Atlas ved hjælp af mongoose

  4. Mongoose kan ikke oprette forbindelse uden internet