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

Jak zrušit platnost částí hierarchie (stromu) dat v mezipaměti Redis

Existují nejméně 3 různé způsoby, jak toho dosáhnout, každý má své vlastní klady a zápory.

Prvním přístupem je použití neatomického ad-hoc skenování stromu k identifikaci a zrušení platnosti (smazání) 2. úrovně stromu (1. sada přizpůsobení). Chcete-li to provést, použijte hierarchické schéma pojmenování polí hash a iterujte je pomocí HSCAN . Pokud například předpokládáme, že název klíče hash je ID produktu (např. ProductA), použili byste jako název pole pro první verzi prvního přizpůsobení něco jako „0001:0001“, pro druhou verzi a „0001:0002“ tak dále. Podobně '0002:0001' by byla 2. přizpůsobení 1. verze atd... Poté vyhledejte všechny verze přizpůsobení 42 a použijte HSCAN ProductA 0 MATCH 0042:* , HDEL pole v odpovědi a opakujte, dokud kurzor nenuluje.

Opačným přístupem je proaktivně „indexovat“ verze každého přizpůsobení, abyste je mohli efektivně načíst namísto provádění úplného skenování hash. Způsob, jak toho dosáhnout, je použití sad Redis – ponecháte si sadu se všemi názvy polí pro danou verzi produktu. Verze mohou být buď sekvenční (jako v mém příkladu), nebo cokoli jiného, ​​pokud jsou jedinečné. Náklady jsou udržovány těchto indexů – kdykoli přidáte nebo odeberete přizpůsobení a/nebo verzi produktu, budete muset udržovat konzistenci s těmito sadami. Například vytvoření verze by bylo něco jako:

HSET ProductA 0001:0001 "<customization 1 version 1 JSON payload"
SADD ProductA:0001 0001

Upozorňujeme, že tyto dvě operace by měly být v jedné transakci (tj. použijte MULTI\EXEC blok nebo EVAL skript Lua). Když máte toto nastavení, zrušení platnosti přizpůsobení je jen otázkou volání SMEMBERS na příslušném Setu a odstranění verzí v něm z Hashe (a Setu samotného). Je však důležité poznamenat, že čtení všech členů z velké sady může být časově náročné – 1000 členů není tak špatné, ale pro větší sady existuje SSCAN .

Nakonec byste mohli zvážit použití tříděné sady namísto hash. I když je to v tomto případě možná méně intuitivní, tříděná sada vám umožní provádět všechny operace, které potřebujete. Cenou za jeho použití je však zvýšená složitost O(logN) pro přidávání/odebírání/čtení ve srovnání s hashovým O(1), ale vzhledem k číslům není rozdíl významný.

Chcete-li uvolnit sílu tříděné sady, použijete lexikografické řazení, takže všichni členové tříděné sady by měli mít stejné skóre (např. použijte 0). Každý produkt bude reprezentován Sorted Set, stejně jako u hash. Členy sady jsou ekvivalenty pole hash, konkrétně verze přizpůsobení. „Trik“ spočívá v konstruování členů způsobem, který vám umožňuje provádět prohledávání rozsahu (nebo zneplatnění úrovně 2, chcete-li). Zde je příklad toho, jak by to mělo vypadat (všimněte si, že zde klíčový produkt A není hash, ale tříděná sada):

ZADD ProductA 0 0001:0001:<JSON>

Chcete-li si přečíst verzi přizpůsobení, použijte ZRANGEBYLEX ProductA [0001:0001: [0001:0001:\xff a rozdělit JSON z odpovědi a k ​​odstranění celého přizpůsobení použijte ZREMRANGEBYLEX .




  1. Model.find() vrací v mongoose prázdnou

  2. Procento podmínek NEBO shodných v mongodb

  3. MongoDB porovnává data pouze bez časů

  4. Redis/Jedis žádný bod selhání a automatické převzetí služeb při selhání