Redis
 sql >> Base de données >  >> NoSQL >> Redis

Redis - Ensemble trié, rechercher un élément par valeur de propriété

Je pense que c'est très simple.

Solution 1 (inférieure, non recommandée)

Votre façon de ZSCAN MySet 0 MATCH Id:92 count 1 n'a pas fonctionné car la chaîne stockée est "{\"Id\":\"92\"... pas "{\"Id:92\"... . La chaîne a été modifiée dans un autre format. Essayez donc d'utiliser MATCH Id\":\"64 ou quelque chose comme ça pour correspondre aux données sérialisées json dans redis. Je ne connais pas json.net, donc la chaîne réelle vous laisse découvrir.

Au fait, je dois vous demander si vous avez fait ZSCAN MySet 0 MATCH Id:92 count 1 retourner un curseur ? Je soupçonne que vous avez utilisé ZSCAN dans le mauvais sens.

Solution 2 (meilleure, fortement recommandée)

ZSCAN est bon lorsque votre ensemble trié n'est pas volumineux et que vous savez comment économiser du temps d'aller-retour sur le réseau grâce à la transaction Lua de Redis. Cela rend toujours l'opération de "recherche par ID" O(n). Par conséquent, une meilleure solution consiste à modifier votre modèle de données de la manière suivante :

modifier l'ensemble trié depuis

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

à

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

Déplacez les données détaillées restantes dans un autre ensemble de clés de type hachage :

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

Ensuite, vous localisez par id en faisant hgetall id:92 . En ce qui concerne la requête étendue par date, vous devez faire ZRANGEBYSCORE sortedset mindate maxdate puis hgetall chaque identifiant un par un. Vous feriez mieux d'utiliser lua pour regrouper ces commandes en une seule et ce sera toujours super rapide !

Les données de la base de données NoSql doivent être organisées de manière redondante comme ci-dessus. Cela peut faire en sorte que certaines opérations habituelles impliquent plus d'une commande et un aller-retour, mais cela peut être résolu par la fonction lua de redis. Je recommande fortement la fonctionnalité lua de redis, car elle encapsule les commandes dans un aller-retour réseau, qui sont toutes exécutées côté serveur redis et sont atomiques et super rapides !

Répondez s'il y a quelque chose que vous ne savez pas