sql >> Databáze >  >> NoSQL >> Redis

Řetězce Redis vs Redis hashe reprezentující JSON:účinnost?

Tento článek může poskytnout mnoho informací zde:http://redis.io/topics/memory-optimization

Existuje mnoho způsobů, jak uložit pole objektů v Redis (spoiler :Líbí se mi možnost 1 pro většinu případů použití):

  1. Uložte celý objekt jako řetězec kódovaný JSON do jediného klíče a sledujte všechny objekty pomocí sady (nebo seznamu, pokud je to vhodnější). Například:

    INCR id:users
    SET user:{id} '{"name":"Fred","age":25}'
    SADD users {id}
    

    Obecně řečeno, je to ve většině případů pravděpodobně nejlepší metoda. Pokud je v objektu mnoho polí, vaše objekty nejsou vnořeny s jinými objekty a máte tendenci přistupovat pouze k malé podmnožině polí najednou, může být lepší zvolit možnost 2.

    Výhody :považováno za "dobrý postup." Každý objekt je plnohodnotným klíčem Redis. Analýza JSON je rychlá, zvláště když potřebujete přistupovat k mnoha polím pro tento objekt najednou. Nevýhody :pomalejší, když potřebujete přístup pouze k jednomu poli.

  2. Uložte vlastnosti každého objektu do hash Redis.

    INCR id:users
    HMSET user:{id} name "Fred" age 25
    SADD users {id}
    

    Výhody :považováno za "dobrý postup." Každý objekt je plnohodnotným klíčem Redis. Není třeba analyzovat řetězce JSON. Nevýhody :možná pomalejší, když potřebujete získat přístup ke všem/většině polí v objektu. Také vnořené objekty (Objects within Objects) nelze snadno uložit.

  3. Uložte každý objekt jako řetězec JSON v hash Redis.

    INCR id:users
    HMSET users {id} '{"name":"Fred","age":25}'
    

    To vám umožní trochu konsolidovat a použít pouze dva klíče místo spousty klíčů. Zjevnou nevýhodou je, že nemůžete nastavit TTL (a další věci) pro každý uživatelský objekt, protože je to pouze pole v hash Redis a ne plnohodnotný klíč Redis.

    Výhody :Analýza JSON je rychlá, zvláště když potřebujete přistupovat k mnoha polím pro tento objekt najednou. Méně „znečišťování“ jmenného prostoru hlavního klíče. Nevýhody :Přibližně stejné využití paměti jako číslo 1, když máte hodně objektů. Pomalejší než #2, když potřebujete přístup pouze k jednomu poli. Pravděpodobně to není považováno za "dobrý postup."

  4. Uložte každou vlastnost každého objektu do vyhrazeného klíče.

    INCR id:users
    SET user:{id}:name "Fred"
    SET user:{id}:age 25
    SADD users {id}
    

    Podle článku výše je tato možnost téměř nikdy preferováno (pokud vlastnost objektu nemusí mít specifické TTL nebo něco podobného).

    Výhody :Vlastnosti objektu jsou plnohodnotné klíče Redis, které nemusí být pro vaši aplikaci přehnané. Nevýhody :pomalé, využívá více paměti a není považováno za „nejlepší postup“. Hodně znečišťuje hlavní klíčový jmenný prostor.

Celkové shrnutí

Možnost 4 obecně není preferována. Možnosti 1 a 2 jsou velmi podobné a obě jsou docela běžné. Dávám přednost možnosti 1 (obecně řečeno), protože vám umožňuje ukládat složitější objekty (s více vrstvami vnoření atd.) Možnost 3 se používá, když vám to opravdu záleží o neznečišťování jmenného prostoru hlavního klíče (tj. nechcete, aby ve vaší databázi bylo hodně klíčů a nestarali jste se o věci jako TTL, sharding klíčů nebo cokoli jiného).

Pokud jsem zde něco popletl, zvažte zanechání komentáře a dovolte mi upravit odpověď, než budu hlasovat proti. Dík! :)



  1. Jak na to:Indexujte data z S3 pomocí CDP Data Hub

  2. Jak převést pymongo.cursor.Cursor na diktát?

  3. Jak klíče jmenného prostoru na redis, aby nedošlo ke kolizím jmen?

  4. Jak mohu exportovat/vymazat databázi mongodb?