Den här artikeln kan ge mycket insikt här:http://redis.io/topics/memory-optimization
Det finns många sätt att lagra en rad objekt i Redis (spoiler :Jag gillar alternativ 1 för de flesta användningsfall):
-
Lagra hela objektet som JSON-kodad sträng i en enda nyckel och håll reda på alla objekt med hjälp av en uppsättning (eller lista, om mer lämpligt). Till exempel:
INCR id:users SET user:{id} '{"name":"Fred","age":25}' SADD users {id}
Generellt sett är detta förmodligen den bästa metoden i de flesta fall. Om det finns många fält i objektet, dina objekt är inte kapslade med andra objekt och du tenderar att bara komma åt en liten delmängd av fält åt gången, kan det vara bättre att välja alternativ 2.
Fördelar :anses vara en "god praxis." Varje objekt är en komplett Redis-nyckel. JSON-parsning är snabb, speciellt när du behöver komma åt många fält för detta objekt samtidigt. Nackdelar :långsammare när du bara behöver komma åt ett enda fält.
-
Lagra varje objekts egenskaper i en Redis-hash.
INCR id:users HMSET user:{id} name "Fred" age 25 SADD users {id}
Fördelar :anses vara en "god praxis." Varje objekt är en komplett Redis-nyckel. Inget behov av att analysera JSON-strängar. Nackdelar :möjligen långsammare när du behöver komma åt alla/de flesta av fälten i ett objekt. Dessutom kan kapslade objekt (objekt inom objekt) inte enkelt lagras.
-
Lagra varje objekt som en JSON-sträng i en Redis-hash.
INCR id:users HMSET users {id} '{"name":"Fred","age":25}'
Detta gör att du kan konsolidera lite och bara använda två nycklar istället för massor av nycklar. Den uppenbara nackdelen är att du inte kan ställa in TTL (och andra saker) på varje användarobjekt, eftersom det bara är ett fält i Redis-hash och inte en fullständig Redis-nyckel.
Fördelar :JSON-analys är snabb, speciellt när du behöver komma åt många fält för detta objekt samtidigt. Mindre "förorenande" av huvudnyckelns namnutrymme. Nackdelar :Ungefär samma minnesanvändning som #1 när du har många objekt. Långsammare än #2 när du bara behöver komma åt ett enda fält. Antagligen inte anses vara en "god praxis."
-
Lagra varje egenskap för varje objekt i en dedikerad nyckel.
INCR id:users SET user:{id}:name "Fred" SET user:{id}:age 25 SADD users {id}
Enligt artikeln ovan är det här alternativet nästan aldrig föredragen (såvida inte objektets egenskap behöver ha specifik TTL eller något).
Fördelar :Objektegenskaper är kompletta Redis-nycklar, vilket kanske inte är överdrivet för din app. Nackdelar :långsam, använder mer minne och anses inte vara "bästa praxis". Mycket förorenande av huvudnyckelnamnutrymmet.
Övergripande sammanfattning
Alternativ 4 är i allmänhet inte att föredra. Alternativ 1 och 2 är väldigt lika, och de är båda ganska vanliga. Jag föredrar alternativ 1 (allmänt sett) eftersom det låter dig lagra mer komplicerade objekt (med flera lager av kapsling, etc.) Alternativ 3 används när du verkligen bryr dig om att inte förorena huvudnyckelns namnutrymme (dvs. du vill inte att det ska finnas många nycklar i din databas och du bryr dig inte om saker som TTL, nyckelklippning eller vad som helst).
Om jag har något fel här, vänligen överväg att lämna en kommentar och tillåta mig att revidera svaret innan jag röstar ned. Tack! :)