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

Redis - Seřazená sada, vyhledejte položku podle hodnoty vlastnosti

Myslím, že je to velmi jednoduché.

Řešení 1 (nižší, nedoporučuje se)

Váš způsob ZSCAN MySet 0 MATCH Id:92 count 1 nefungovalo, protože uložený řetězec je "{\"Id\":\"92\"... ne "{\"Id:92\"... . Řetězec byl změněn do jiného formátu. Zkuste tedy použít MATCH Id\":\"64 nebo něco takového, aby odpovídalo serializovaným datům json v redis. Nejsem obeznámen s json.net, takže skutečný řetězec necháte na vás.

Mimochodem, musím se vás zeptat, zda jste provedli ZSCAN MySet 0 MATCH Id:92 count 1 vrátit kurzor? Mám podezření, že jste použili ZSCAN špatným způsobem.

Řešení 2 (lepší, důrazně doporučeno)

ZSCAN je dobré, když vaše seřazená sada není velká a víte, jak ušetřit čas zpáteční cesty po síti pomocí transakce Redis' Lua. To stále dělá operaci "vyhledat podle ID" O(n). Proto je lepším řešením změnit svůj datový model následujícím způsobem:

změnit seřazenou sadu od

#   Score   Value
0   1443476076 {"Id":"92","Ref":"7ADT","DTime":1443476076,"ATime":1443901554,"ExTime":0,"SPName":"7ADT33CFSAU6","StPName":"7ADT33CFSAU6"}
1   1443482969 {"Id":"11","Ref":"DAJT","DTime":1443482969,"ATime":1443901326,"ExTime":0,"SPName":"DAJTJTT4T02O","StPName":"DAJTJTT4T02O"}

do

#   Score   Value
0   1443476076 Id:92
1   1443482969 Id:11

Přesuňte zbývající podrobná data do jiné sady klíčů typu hash:

#   Key   field-value field-value ...
0   Id:92 Ref-7ADT DTime-1443476076 ...
1   Id:11 Ref-7ADT DTime-1443476076 ...

Poté vyhledejte podle id provedením hgetall id:92 . Pokud jde o dotaz seřazený podle data, musíte provést ZRANGEBYSCORE sortedset mindate maxdate pak hgetall každé ID jedno po druhém. Raději použijte lua k zabalení těchto příkazů do jednoho a stále to bude super rychlé!

Data v databázi NoSql musí být organizována redundantním způsobem, jak je uvedeno výše. To může způsobit, že některé obvyklé operace zahrnují více než jeden příkaz a zpáteční cestu, ale lze to vyřešit pomocí funkce lua společnosti redis. Důrazně doporučuji funkci lua redis, protože zabaluje příkazy do jednoho síťového zpátečního spojení, které jsou všechny prováděny na straně redis-serveru a jsou atomické a super rychlé!

Odpovězte, pokud něco nevíte




  1. MongoDB $dayOfMonth

  2. Jak mohu získat hodnotu z Redis a vložit ji do proměnné v NGiNX?

  3. Ukládání a načítání objektů JavaScript v/z MongoDB

  4. MongoDB - Vytáhněte více objektů z pole