sql >> Database >  >> NoSQL >> Redis

Geheugenefficiënte manier om 32-bits geheel getal met teken op te slaan in Redis

Intern slaat Redis strings op de meest efficiënte manier op. Het forceren van gehele getallen in radix 10 strings zal in feite meer geheugen gebruiken.

Hier is hoe Redis Strings opslaat -

  1. Gehele getallen kleiner dan 10000 worden opgeslagen in een gedeelde geheugenpool en hebben geen geheugenoverhead. Als je wilt, kun je deze limiet verhogen door de constante REDIS_SHARED_INTEGERS in redis.h te wijzigen en Redis opnieuw te compileren.
  2. Gehele getallen groter dan 10000 en binnen het bereik van een lange verbruiken 8 bytes.
  3. Gewone strings nemen len(string) + 4 bytes voor lengte + 4 bytes voor het markeren van vrije ruimte + 1 byte voor null-terminator + 8 bytes voor malloc overheads.

In het door u aangehaalde voorbeeld is het een kwestie van 8 bytes voor een lange v/s 21 bytes voor de string.

EDIT:

Dus als ik een reeks getallen heb die allemaal kleiner zijn dan 10.000, hoe slaat Redis mijn reeks dan op?

Het hangt af van hoeveel elementen je hebt.

Als je minder dan 512 elementen in je set hebt (zie set-max-intset-entries ), dan wordt de set opgeslagen als een IntSet. Een IntSet is een verheerlijkte naam voor een Sorted Integer Array. Aangezien uw getallen kleiner zijn dan 10000, zou het 16 bits per element gebruiken. Het is (bijna) even geheugenefficiënt als een C-array.

Als je meer dan 512 elementen hebt, wordt de set een HashTable. Elk element in de set is verpakt in een structuur genaamd robj , met een overhead van 16 bytes. De robj structuur heeft een verwijzing naar de gedeelde pool van gehele getallen, dus u betaalt niets extra voor het gehele getal zelf. En tot slot, de robj instanties worden opgeslagen in de hashtabel en de hashtabel heeft een overhead die evenredig is met de grootte van de set.

Als je geïnteresseerd bent in hoeveel geheugen een element precies verbruikt, voer dan redis-rdb-tools uit op je dataset (disclaimer:ik ben de auteur van deze tool). Of u kunt de broncode voor de klasse MemoryCallback lezen, de opmerkingen leggen uit hoe het geheugen is ingedeeld.



  1. Selecteer records die overeenkomen met de concat-waarde van twee velden in mongodb

  2. Spring Redis-sorteersleutels

  3. Hoe hideIndex() werkt in MongoDB

  4. stuur een downstream-bericht naar google ccs met node js