Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Redis - Conjunto classificado, encontre item por valor de propriedade


Eu acho que é muito simples.

Solução 1 (Inferior, não recomendado)


Sua maneira de ZSCAN MySet 0 MATCH Id:92 count 1 não funcionou porque a string armazenada é "{\"Id\":\"92\"... não "{\"Id:92\"... . A string foi alterada para outro formato. Portanto, tente usar MATCH Id\":\"64 ou algo assim para corresponder aos dados serializados json em redis. Eu não estou familiarizado com json.net, então a string real deixa para você descobrir.

A propósito, tenho que perguntar se você fez ZSCAN MySet 0 MATCH Id:92 count 1 retornar um cursor? Eu suspeito que você usou ZSCAN de forma errada.

Solução 2 (melhor, altamente recomendada)


ZSCAN é bom quando seu conjunto classificado não é grande e você sabe como economizar tempo de ida e volta da rede pela transação Lua do Redis. Isso ainda faz a operação "pesquisar por ID" O(n). Portanto, uma solução melhor é alterar seu modelo de dados da seguinte maneira:

alterar conjunto ordenado de
#   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"}

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

Mova os dados detalhados restantes em outro conjunto de chaves do tipo hashes:
#   Key   field-value field-value ...
0   Id:92 Ref-7ADT DTime-1443476076 ...
1   Id:11 Ref-7ADT DTime-1443476076 ...

Então, você localiza por id fazendo hgetall id:92 . Quanto à consulta de intervalo por data, você precisa fazer ZRANGEBYSCORE sortedset mindate maxdate então hgetall cada id um por um. É melhor você usar lua para agrupar esses comandos em um e ainda será super rápido!

Os dados no banco de dados NoSql precisam ser organizados de forma redundante como acima. Isso pode fazer com que algumas operações usuais envolvam mais de um comando e ida e volta, mas pode ser resolvida pelo recurso lua do redis. Eu recomendo fortemente o recurso lua do redis, porque ele envolve comandos em uma ida e volta da rede, que são todos executados no lado do servidor redis e é atômico e super rápido!

Responda se houver algo que você não saiba