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

Multiparametrový vyhledávač zápasů s Redis

To, co se zde pokoušíte udělat, je obrácený index.

Pro každý sloupec jej nechte namapovat na „množinu“. Potom můžete množiny protnout a získat výsledek.

Takže APPLE: RED ROUND FRUIT by mapoval na následující vložky:

SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE

Pak řekněme, že chci dotaz na * ROUND FRUIT , udělal bych:

SINTER p2:ROUND p3:FRUIT

Tento příkaz je průsečíkem položek v p2:ROUND set a p3:FRUIT soubor. Tím se vrátí všechny položky, které jsou ROUND a FRUIT , bez ohledu na to, co p1 je.

Některé další příklady:

SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN

Moje výše uvedená odpověď bude využívat určitý výpočetní výkon, protože operace křižovatky je O(N*M) . Zde je způsob, jak toho dosáhnout, který je náročnější na paměť, ale bude mít rychlejší načítání, protože efektivně předpočítá indexy.

Pro každou kombinaci vlastností vytvořte klíč, který uloží sadu:

Takže APPLE: RED ROUND FRUIT by mapoval na následující vložky:

SADD RED:ROUND:FRUIT APPLE
SADD :ROUND:FRUIT APPLE
SADD RED::FRUIT APPLE
SADD RED:ROUND: APPLE
SADD RED:: APPLE
SADD :ROUND: APPLE
SADD ::FRUIT APPLE
SADD ::: APPLE

Poté pro dotaz jednoduše přistoupíte k příslušnému klíči. Například * ROUND FRUIT by prostě bylo

SMEMBERS :ROUND:FRUIT

Je zřejmé, že se to vůbec neškáluje dobře z hlediska paměti, když máte mnoho dimenzí, ale načítání výsledků bude extrémně rychlé.




  1. Mongodump ze vzdáleného serveru

  2. Snižte dobu provádění úloh sidekiq

  3. Možnost generování duplicitních Mongo ObjectId ve dvou různých kolekcích?

  4. Proč soubor Redis dump.rdb o velikosti 500 MB zabírá asi 5,0 GB paměti?