sql >> Base de Datos >  >> NoSQL >> Redis

Redis:conjunto ordenado, buscar elemento por valor de propiedad

Creo que es muy simple.

Solución 1(Inferior, no recomendada)

Tu manera de ZSCAN MySet 0 MATCH Id:92 count 1 no funcionó porque la cadena almacenada es "{\"Id\":\"92\"... no "{\"Id:92\"... . La cadena se ha cambiado a otro formato. Así que intenta usar MATCH Id\":\"64 o algo así para que coincida con los datos serializados json en redis. No estoy familiarizado con json.net, por lo que la cadena real queda para que la descubras.

Por cierto, tengo que preguntarte si ZSCAN MySet 0 MATCH Id:92 count 1 devolver un cursor? Sospecho que usaste ZSCAN de manera incorrecta.

Solución 2(Mejor, muy recomendable)

ZSCAN es bueno cuando su conjunto ordenado no es grande y sabe cómo ahorrar tiempo de ida y vuelta en la red mediante la transacción Lua de Redis. Esto todavía hace que la operación "buscar por ID" sea O (n). Por lo tanto, una mejor solución es cambiar su modelo de datos de la siguiente manera:

cambiar conjunto ordenado desde

#   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"}

a

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

Mueva el resto de datos detallados en otro conjunto de claves de tipo hash:

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

Luego, localiza por id haciendo hgetall id:92 . En cuanto a la consulta a distancia por fecha, debe hacer ZRANGEBYSCORE sortedset mindate maxdate entonces hgetall cada id uno por uno. ¡Será mejor que uses lua para envolver estos comandos en uno y seguirá siendo súper rápido!

Los datos en la base de datos NoSql deben organizarse de manera redundante como se muestra arriba. Esto puede hacer que alguna operación habitual implique más de un comando y de ida y vuelta, pero se puede abordar con la función lua de redis. Recomiendo encarecidamente la función lua de redis, porque envuelve los comandos en un viaje de ida y vuelta de la red, que se ejecutan en el lado del servidor redis y es atómico y súper rápido.

Responde si hay algo que no sabes