Denne artikel kan give en masse indsigt her:http://redis.io/topics/memory-optimization
Der er mange måder at gemme en række objekter i Redis (spoiler :Jeg kan godt lide mulighed 1 i de fleste tilfælde):
-
Gem hele objektet som JSON-kodet streng i en enkelt nøgle, og hold styr på alle objekter ved hjælp af et sæt (eller en liste, hvis det er mere passende). For eksempel:
INCR id:users SET user:{id} '{"name":"Fred","age":25}' SADD users {id}
Generelt er dette nok den bedste metode i de fleste tilfælde. Hvis der er mange felter i objektet, dine objekter ikke er indlejret med andre objekter, og du har tendens til kun at få adgang til et lille undersæt af felter ad gangen, kan det være bedre at vælge mulighed 2.
Fordele :betragtes som en "god praksis." Hvert objekt er en komplet Redis-nøgle. JSON-parsing er hurtig, især når du skal have adgang til mange felter for dette objekt på én gang. Ulempe :langsommere, når du kun skal have adgang til et enkelt felt.
-
Gem hvert objekts egenskaber i en Redis-hash.
INCR id:users HMSET user:{id} name "Fred" age 25 SADD users {id}
Fordele :betragtes som en "god praksis." Hvert objekt er en komplet Redis-nøgle. Det er ikke nødvendigt at parse JSON-strenge. Ulempe :muligvis langsommere, når du skal have adgang til alle/de fleste felter i et objekt. Desuden kan indlejrede objekter (objekter i objekter) ikke nemt gemmes.
-
Gem hvert objekt som en JSON-streng i en Redis-hash.
INCR id:users HMSET users {id} '{"name":"Fred","age":25}'
Dette giver dig mulighed for at konsolidere en smule og kun bruge to nøgler i stedet for masser af nøgler. Den åbenlyse ulempe er, at du ikke kan indstille TTL (og andre ting) på hvert brugerobjekt, da det blot er et felt i Redis-hashen og ikke en fuld-udviklet Redis-nøgle.
Fordele :JSON-parsing er hurtig, især når du skal have adgang til mange felter for dette objekt på én gang. Mindre "forurenende" af hovednøglenavneområdet. Ulempe :Omtrent samme hukommelsesbrug som #1, når du har mange objekter. Langsommere end #2, når du kun skal have adgang til et enkelt felt. Sandsynligvis ikke betragtet som en "god praksis."
-
Gem hver egenskab for hvert objekt i en dedikeret nøgle.
INCR id:users SET user:{id}:name "Fred" SET user:{id}:age 25 SADD users {id}
Ifølge artiklen ovenfor er denne mulighed næsten aldrig foretrækkes (medmindre objektets egenskab skal have specifik TTL eller noget).
Fordele :Objektegenskaber er fuldt udbyggede Redis-nøgler, som måske ikke er overdrevent for din app. Ulempe :langsom, bruger mere hukommelse og betragtes ikke som "bedste praksis". Masser af forurening af hovednøglenavneområdet.
Samlet oversigt
Mulighed 4 foretrækkes generelt ikke. Mulighed 1 og 2 er meget ens, og de er begge ret almindelige. Jeg foretrækker mulighed 1 (generelt set), fordi den giver dig mulighed for at gemme mere komplicerede objekter (med flere lag af indlejring osv.) Mulighed 3 bruges, når du virkelig bekymrer dig om ikke at forurene hovednøglenavneområdet (dvs. du vil ikke have, at der skal være mange nøgler i din database, og du er ligeglad med ting som TTL, nøgleskæring eller hvad som helst).
Hvis jeg tog noget galt her, så overvej at efterlade en kommentar og tillade mig at revidere svaret, før jeg nedstemmer. Tak! :)