Internt lagrar Redis strängar på det mest effektiva sättet. Att tvinga in heltal i radix 10-strängar kommer faktiskt att använda mer minne.
Så här lagrar Redis Strings -
- Heltal mindre än 10 000 lagras i en delad minnespool och har inga minneskostnader. Om du vill kan du öka denna gräns genom att ändra konstanten REDIS_SHARED_INTEGERS i redis.h och kompilera om Redis.
- Heltal större än 10 000 och inom räckhåll för en lång konsumtion av 8 byte.
- Vanliga strängar tar len(sträng) + 4 byte för längd + 4 byte för att markera ledigt utrymme + 1 byte för nollterminator + 8 byte för malloc-overhead.
I exemplet du citerade är det en fråga om 8 byte för en lång v/s 21 byte för strängen.
EDIT:
Så om jag har en uppsättning nummer som alla är mindre än 10 000, hur lagrar Redis min uppsättning?
Det beror på hur många element du har.
Om du har mindre än 512 element i din uppsättning (se set-max-intset-entries
), så kommer uppsättningen att lagras som en IntSet. En IntSet är ett glorifierat namn för en Sorterad heltalsmatris. Eftersom dina siffror är mindre än 10 000 skulle det använda 16 bitar per element. Den är (nästan) lika minneseffektiv som en C-array.
Om du har fler än 512 element blir uppsättningen en HashTable. Varje element i uppsättningen är insvept i en struktur som kallas robj
, som har en overhead på 16 byte. robj
struktur har en pekare till den delade poolen av heltal, så du betalar inget extra för själva heltal. Och slutligen, robj
instanser lagras i hashtabellen, och hashtabellen har en overhead som är proportionell mot storleken på uppsättningen.
Om du är intresserad av exakt hur mycket minne ett element förbrukar, kör redis-rdb-tools på din datauppsättning (friskrivning:jag är författaren till det här verktyget). Eller så kan du läsa källkoden för klassen MemoryCallback, kommentarerna förklarar hur minnet är upplagt.