sql >> Databasteknik >  >> NoSQL >> Redis

Redis 10 gånger mer minnesanvändning än data

Detta förväntas väl av all effektiv datalagring:orden måste indexeras i minnet i en dynamisk datastruktur av celler länkade med pekare. Storleken på strukturens metadata, pekare och intern fragmentering av minnesallokatorn är anledningen till att data tar mycket mer minne än en motsvarande platt fil.

En Redis-uppsättning implementeras som en hashtabell. Detta inkluderar:

  • en rad pekare som växer geometriskt (tvåpotenser)
  • en andra array kan krävas när inkrementell omhasning är aktiv
  • enkellänkade listceller som representerar posterna i hashtabellen (3 pekare, 24 byte per post)
  • Redis-objektomslag (en per värde) (16 byte per post)
  • faktiska data själva (var och en av dem har 8 byte som prefix för storlek och kapacitet)

Alla ovanstående storlekar anges för 64-bitars implementering. Om man tar hänsyn till minnesallokatorns overhead, resulterar det i att Redis tar minst 64 byte per set objekt (utöver data) för en ny version av Redis med jemalloc-allokatorn (>=2.4)

Redis tillhandahåller minnesoptimeringar för vissa datatyper, men de täcker inte uppsättningar av strängar. Om du verkligen behöver optimera minnesförbrukningen för set finns det knep du kan använda dock. Jag skulle inte göra detta för bara 160 MB RAM, men om du har större data kan du göra det här.

Om du inte behöver unions-, skärnings-, skillnadsförmågan för uppsättningar, kan du lagra dina ord i hash-objekt. Fördelen är att hashobjekt kan optimeras automatiskt av Redis med hjälp av zipmap om de är tillräckligt små. Zipmap-mekanismen har ersatts av ziplist i Redis>=2.6, men idén är densamma:att använda en serialiserad datastruktur som kan passa i CPU-cachen för att få både prestanda och ett kompakt minnesfotavtryck.

För att garantera att hashobjekten är tillräckligt små kan data distribueras enligt någon hashmekanism. Om du antar att du behöver lagra 1M artiklar, kan lägga till ett ord implementeras på följande sätt:

  • hash it modulo 10000 (gjort på klientsidan)
  • HMSET-ord:[hashnum] [ord] 1

Istället för att lagra:

words => set{ hi, hello, greetings, howdy, bonjour, salut, ... }

du kan lagra:

words:H1 => map{ hi:1, greetings:1, bonjour:1, ... }
words:H2 => map{ hello:1, howdy:1, salut:1, ... }
...

För att hämta eller kontrollera existensen av ett ord är det samma (hasha det och använd HGET eller HEXISTS).

Med denna strategi kan betydande minnesbesparingar göras förutsatt att modulo för hashen är vald enligt zipmap-konfigurationen (eller ziplist för Redis>=2.6):

# Hashes are encoded in a special way (much more memory efficient) when they
# have at max a given number of elements, and the biggest element does not
# exceed a given threshold. You can configure this limits with the following
# configuration directives.
hash-max-zipmap-entries 512
hash-max-zipmap-value 64

Se upp:namnet på dessa parametrar har ändrats med Redis>=2.6.

Här betyder modulo 10000 för 1M objekt 100 objekt per hashobjekt, vilket garanterar att alla lagras som zipmaps/ziplists.



  1. MongoDB backup som text snarare än binär för källkontroll

  2. Hur man tar bort nycklar som matchar ett mönster i Redis

  3. phpredis på fedora 12

  4. Är Redis TimeSeries rätt verktyg för att fånga ljusstakar i aktiekurser