Redis ZSCAN

Redis Zscan



Επανάληψη πάνω από τα μέλη ενός ταξινομημένου συνόλου

Όπως όλοι γνωρίζετε, τα ταξινομημένα σύνολα Redis προέρχονται από τα κανονικά σύνολα όπου κάθε μέλος ταξινομείται με βάση την αξία βαθμολογίας του σε αύξουσα σειρά. Εάν δύο ή περισσότερα μέλη έχουν την ίδια βαθμολογία, ταξινομούνται κατά λεξικογραφική σειρά. Συνήθως, τα μέλη και οι βαθμολογίες μπορούν να ανακτηθούν απευθείας χρησιμοποιώντας την εντολή ZRANGE. Όταν έχετε ένα μεγάλο ταξινομημένο σύνολο με χιλιάδες μέλη, η εντολή ZRANGE μπορεί να αποκλείσει τον διακομιστή για μεγάλο χρονικό διάστημα, όπως οι εντολές SMEMBERS και KEYS, κάτι που αποτελεί μειονέκτημα. Έτσι, το Redis προσφέρει μια ειδική εντολή που ονομάζεται ZSCAN η οποία προέρχεται από την εντολή SCAN για επανάληψη στα μέλη ενός ταξινομημένου συνόλου. Εφόσον η εντολή ZSCAN κληρονομείται από την εντολή SCAN, σχεδόν όλες οι συμπεριφορές είναι ίδιες με την εντολή SCAN γενικού σκοπού.







Όπως στο σχήμα που δίνεται, η εντολή SCAN είναι ένας επαναλήπτης που βασίζεται σε δρομέα. Ως εκ τούτου, χρειάζονται μία ή περισσότερες επαναλήψεις για την παροχή όλων των αντικειμένων μιας συλλογής Redis. Εφόσον η εντολή ZSCAN κληρονομείται από τη γονική εντολή SCAN, η συμπεριφορά είναι η ίδια. Σε αυτόν τον οδηγό, η σύνταξη και οι περιπτώσεις χρήσης της εντολής ZSCAN θα συζητηθούν λεπτομερώς.



Η εντολή ZSCAN

Η εντολή ZSCAN είναι ένας επαναλήπτης που βασίζεται σε δρομέα που ξεκινά την επανάληψη με τον 0ο δρομέα. Στη συνέχεια, σε κάθε επανάληψη, επιστρέφει μηδέν ή περισσότερα ταξινομημένα μέλη συνόλου μαζί με τον επόμενο δρομέα που θα πρέπει να χρησιμοποιηθεί ως δρομέας για την ακόλουθη κλήση εντολών. Εάν ο δρομέας που επιστρέφεται είναι 0 μετά από μία ή περισσότερες επαναλήψεις, σημαίνει ότι η διαδικασία σάρωσης έχει τελειώσει. Όλα τα ταξινομημένα σετ μέλη επιστρέφονται σε αυτό το σημείο. Αυτή η διαδικασία ονομάζεται πλήρης επανάληψη. Όπως θα μπορούσατε να δείτε, η εντολή ZSCAN διατηρεί την κατάστασή της μόνο χρησιμοποιώντας έναν δρομέα που οδηγεί σε περιορισμένη επίγνωση κατάστασης. Επομένως, τα ακόλουθα μειονεκτήματα σχετίζονται με την εντολή ZSCAN.



  • Το ίδιο στοιχείο μπορεί να επιστρέψει σε πολλές επαναλήψεις.
  • Εάν ένα μέλος δεν είναι παρόν στην έναρξη της διαδικασίας σάρωσης, υπάρχει πιθανότητα να μην επιστρέψει αυτό το μέλος κατά τη διάρκεια μιας πλήρους επανάληψης.

Επιπλέον, δεν υπάρχει εγγύηση για τον αριθμό των μελών που επιστράφηκαν. Σε ορισμένες περιπτώσεις, εάν το ταξινομημένο σύνολο είναι πολύ μικρό, όλα τα μέλη ενδέχεται να επιστραφούν στην πρώτη κιόλας επανάληψη. Επειδή το Redis χρησιμοποιεί μια ειδική μορφή κωδικοποίησης με μονή κατανομή για να κρατήσει τα μέλη μέχρι να επιτευχθεί ο μέγιστος αριθμός αντικειμένων. Η εντολή ZSCAN είναι σε θέση να επιστρέψει έναν δρομέα μόνο εάν η δομή των σαρωμένων δεδομένων αναπαρίσταται ως πίνακας κατακερματισμού.





Σύνταξη:
Η εντολή ZSCAN χρησιμοποιεί σχεδόν την ίδια σύνταξη με την εντολή SCAN εκτός από το ότι δέχεται ένα ταξινομημένο κλειδί συνόλου ως πρώτο όρισμα. Η σύνταξη εντολών με τα επιτρεπόμενα ορίσματα είναι η εξής:

ZSCAN sorted_set_key cursor [ Μοτίβο MATCH ] [ COUNT μέλη_count ]

sorted_set_key : Το κλειδί του ταξινομημένου σετ.
Δρομέας : Η τιμή του δρομέα ξεκινά από το 0 και τελειώνει στο 0 εάν πρόκειται για πλήρη επανάληψη.



Τα ακόλουθα ορίσματα είναι προαιρετικά:

ΑΓΩΝΑΣ : Ένα μοτίβο που ταιριάζει κατά την ανάκτηση των στοιχείων σε κάθε επανάληψη. Επιστρέφονται μόνο τα ταιριαστά μέλη.
ΜΕΤΡΩ : Ο κατά προσέγγιση αριθμός των μελών που θα επιστραφούν σε κάθε επανάληψη.

Το επιστρεφόμενο σύνολο αποτελεσμάτων ανά επανάληψη περιέχει μερικά στοιχεία. Το πρώτο μέρος είναι ένας ακέραιος 64-bit χωρίς υπογραφή που αντιπροσωπεύει τον δρομέα που θα μεταβιβαστεί στην επόμενη κλήση. Το επόμενο μέρος είναι μια σειρά μελών και συναφών βαθμολογιών.

Χρήση Περίπτωσης 1 – Ανάκτηση όλων των μελών και των ολοκληρωμένων αποστολών τους ενός διαδικτυακού παιχνιδιού

Ας υποθέσουμε ότι μια εταιρεία διαδικτυακών παιχνιδιών διατηρεί ένα leaderboard χρησιμοποιώντας το ταξινομημένο σύνολο Redis. Δεδομένου ότι τεράστιοι χρήστες παίζουν ενεργά το παιχνίδι, χρειάζονται έναν τρόπο για να ανακτήσουν κάθε παίκτη και τη σχετική βαθμολογία που είναι ο αριθμός των ολοκληρωμένων αποστολών. Είναι απαραίτητο να πραγματοποιήσετε την ανάκτηση χωρίς αποκλεισμό του διακομιστή. Έτσι, η σύσταση είναι να χρησιμοποιήσετε την εντολή ZSCAN ως εξής:

Αρχικά, δημιουργούμε ένα ταξινομημένο σύνολο με μερικούς παίκτες και τον ολοκληρωμένο αριθμό αποστολών.

zadd LeaderBoard 12 Παίκτης 6: Γιάννης 4 Παίκτης 2: Μαίρη 22 Παίκτης 1: Πατέλ δεκαπέντε Παίχτης: έντεκα 23 Παίκτης 5: Ann 30 Παίκτης 7: Σκληρός 23 Παίκτης 12: Abby δύο Παίκτης 13: Νίκυ 6 Παίκτης 9: Τζέρεμι 7 Παίκτης 45: Κίνα

Τώρα, μπορούμε να επαναλάβουμε τα μέλη του ταξινομημένου συνόλου ως εξής:

zscan LeaderBoard 0

Παραγωγή:

Η τιμή του δρομέα είναι 0 στο επιστρεφόμενο σύνολο αποτελεσμάτων που σημαίνει ότι όλα τα μέλη επιστρέφονται στο τέλος της πρώτης επανάληψης. Σε αυτήν την περίπτωση, επειδή ο αριθμός των μελών είναι μικρός, το Redis αντιπροσωπεύει αυτά τα μέλη χρησιμοποιώντας μια κωδικοποίηση πακέτων μίας κατανομής. Επομένως, έως ότου επιτευχθεί ένα μέγιστο μέγεθος πακέτου ή αριθμός μελών, η εντολή επιστρέφει όλα τα μέλη στο ταξινομημένο σύνολο. Αυτό ονομάζεται πλήρης επανάληψη. Γιατί στο τέλος της πρώτης επανάληψης, λαμβάνουμε και τα δέκα μέλη και τις βαθμολογίες τους. Εάν έχουμε εκατοντάδες μέλη, αναπαρίσταται ως πίνακας κατακερματισμού στη μνήμη. Έτσι, χρειάζονται αρκετές επαναλήψεις για να επιστρέψουν όλα τα μέλη.

Η παράμετρος COUNT μπορεί να χρησιμοποιηθεί για τον περιορισμό του αριθμού των μελών που επιστρέφονται σε μια επανάληψη. Από προεπιλογή, αυτό το όρισμα ορίζεται σε 10. Εάν το ταξινομημένο σύνολο αποτελείται από εκατοντάδες μέλη, αντιπροσωπεύεται από έναν πίνακα κατακερματισμού στη μνήμη. Έτσι, ο αριθμός των μελών που επιστρέφονται είναι περίπου δέκα ανά επανάληψη. Η τιμή του ορίσματος COUNT αγνοείται εάν το ταξινομημένο σύνολο είναι πολύ μικρό.

Χρησιμοποιήστε την περίπτωση 2 - Λάβετε τους παίκτες των οποίων το όνομα αρχίζει με το γράμμα 'J'

Η εντολή ZSCAN μπορεί να χρησιμοποιηθεί για να φιλτράρει τα επιστρεφόμενα μέλη με βάση μια αντιστοίχιση μοτίβου. Σε αυτήν την περίπτωση, το όρισμα MATCH πρέπει να καθοριστεί.

Ας χρησιμοποιήσουμε το ίδιο παράδειγμα από την προηγούμενη περίπτωση χρήσης. Η απαίτηση είναι να φέρουμε τους παίκτες των οποίων το όνομα αρχίζει με το γράμμα 'J'. Είναι απλώς για να εφαρμόσετε το επόμενο δροσερό χαρακτηριστικό που σχετίζεται με το παιχνίδι. Το όρισμα MATCH μπορεί να καθοριστεί ως εξής:

zscan LeaderBoard 0 αγώνας * J *

Αυτό θα έπρεπε ιδανικά να επιστρέψει δύο μέλη των οποίων τα ονόματα είναι Jeremy και John.

συμπέρασμα

Συνοπτικά, η εντολή ZSCAN χρησιμοποιείται για επανάληψη πάνω από τα μέλη και τις βαθμολογίες ενός ταξινομημένου συνόλου Redis. Αυτή η εντολή συμπεριφέρεται όπως η εντολή SCAN, με τη διαφορά ότι η εντολή ZSCAN δέχεται το κλειδί set ως πρώτο όρισμα. Όπως συζητήθηκε στις περιπτώσεις χρήσης, η εντολή ZSCAN μπορεί να χρησιμοποιηθεί με διαφορετικούς τρόπους καθορίζοντας τα ορίσματα MATCH και COUNT όπου μπορείτε να ανακτήσετε τα μέλη και τις σχετικές βαθμολογίες που ταιριάζουν με ένα συγκεκριμένο μοτίβο και να περιορίσετε τον αριθμό μελών που επιστρέφεται ανά επανάληψη. Συνολικά, η εντολή ZSCAN μπορεί να είναι χρήσιμη κατά την ανάκτηση των μελών ενός ταξινομημένου συνόλου χωρίς αποκλεισμό του διακομιστή ή του πελάτη.