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

Άποψη: 6755|Απάντηση: 3

[Πηγή] Το .NET/C# χρησιμοποιεί το Redis για να υλοποιήσει τον αλγόριθμο Bloom που βασίζεται στο BitMap

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 2/1/2023 5:37:01 μ.μ. | | | |
απαιτήσεις: Πρόσφατα, είδα ένα βίντεο του αλγορίθμου Redis Bloom στο Bilibili για να λύσω το πρόβλημα της διείσδυσης της κρυφής μνήμης, με απλά λόγια, να προσθέσω ένα επίπεδο λογικής κρίσης πριν αποκτήσω πρόσβαση στη βάση δεδομένων για να προσδιορίσω εάν υπάρχουν τα δεδομένα και, εάν ναι, πρόσβαση στη βάση δεδομένων. Για παράδειγμα, εάν ένας ιστότοπος είναι ένα σύστημα ειδήσεων, οι διευθύνσεις URL των άρθρων δημιουργούνται από αυτο-αυξανόμενα αναγνωριστικά πρωτεύοντος κλειδιού (μορφή URL example:/news-1.html), ο ιστότοπος μπορεί να έχει μόνο δεκάδες χιλιάδες άρθρα και κρυφές μνήμες.

Αρχικά:

Αίτηση πόρου ειδήσεων -> Προσδιορίστε εάν υπάρχει το cache -> Παρουσία -> Το cache επιστρέφει δεδομένα.
Αίτηση πόρων ειδήσεων -> Προσδιορίστε εάν υπάρχει το cache -> δεν υπάρχει -> Ερώτημα από τη βάση δεδομένων -> Παρουσίαση -> Προσωρινή αποθήκευση και επιστροφή δεδομένων.
Αίτηση πόρου ειδήσεων -> Προσδιορίστε εάν υπάρχει το cache -> δεν υπάρχει -> Ερώτημα από τη βάση δεδομένων -> Δεν υπάρχει -> Επιστρέφει σφάλμα 404.

Αυτή τη στιγμή:

Ζητήστε πηγή ειδήσεων -> αλγόριθμος του Bloom -> Ύπαρξη -> Ακολουθήστε την αρχική λογική.
Αίτημα πόρου ειδήσεων -> Ο αλγόριθμος του Bloom -> δεν υπάρχει -> επιστρέφει απευθείας ένα σφάλμα 404.

Φίλτρο άνθισης

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

Ο αλγόριθμος του Bloom είναι μια μέθοδος που βασίζεται σεΘυσιάστε μια συγκεκριμένη ακρίβεια με αντάλλαγμα έναν αλγόριθμο φιλτραρίσματος με χαμηλή κατανάλωση μνήμης, το οποίο μπορεί να πραγματοποιήσει το φιλτράρισμα, την αφαίρεση διπλότυπων και άλλες λειτουργίες μεγάλου όγκου δεδομένων.

Ο αλγόριθμος Bloom είναι απλώς μια αφηρημένη έννοια και μπορεί να εφαρμοστεί με πολλούς τρόπους, και η χρήση του BitMap στο Redis στο άρθρο είναι απλώς μια απλή υλοποίηση.

Αναφορά:Η σύνδεση με υπερσύνδεσμο είναι ορατή.

Εισαγωγή BitMap

Το BitMap είναι ένα bitmap, το οποίο είναι στην πραγματικότητα ένας πίνακας byte, που αναπαρίσταται σε δυαδικό.Υπάρχουν μόνο δύο αριθμοί, το 0 και το 1, bitmap είναι να χρησιμοποιήσετε κάθε δυαδικό bit για να αποθηκεύσετε ή να επισημάνετε την τιμή που αντιστοιχεί σε ένα στοιχείο. Συνήθως χρησιμοποιείται για να προσδιοριστεί εάν υπάρχουν συγκεκριμένα δεδομένα ή όχι, επειδή αποθηκεύονται σε bit, επομένως το ίδιο το Bitmap θα εξοικονομήσει σημαντικά χώρο αποθήκευσης.

Όπως φαίνεται στο παρακάτω σχήμα, η συμβολοσειρά αποθηκεύεται σε δυαδική μορφή στον υπολογιστή.



Τύποι δεδομένων BitMap στο Redis

Ο τύπος δεδομένων που παρέχεται από το Redis είναι BitMap και κάθε bit αντιστοιχεί σε δύο καταστάσεις: 0 και 1. Αν και ο εσωτερικός χώρος αποθήκευσης εξακολουθεί να είναι τύπου String, το Redis παρέχει ορισμένες οδηγίες για τον άμεσο χειρισμό του BitMap, το οποίο μπορεί να θεωρηθεί ως πίνακας bit και ο δείκτης του πίνακα είναι η μετατόπιση.

Τα πλεονεκτήματά του είναι:Χαμηλή επιβάρυνση μνήμης και υψηλή απόδοσηΚαι η λειτουργία είναι απλή.

Εξοικονόμηση χώρου: Ένα bit χρησιμοποιείται για να αναπαραστήσει την τιμή ή την κατάσταση ενός στοιχείου, όπου κλειδί είναι η τιμή του αντίστοιχου στοιχείου. Στην πραγματικότητα, 8 bit μπορούν να αποτελέσουν ένα byte, επομένως εξοικονομεί χώρο.
Υψηλή απόδοση: Η χρονική πολυπλοκότητα του setbit και του getbit είναι O(1) και η απόδοση άλλων bit είναι επίσης υψηλή.

Ακολουθεί ένα παράδειγμα χρήσης της συλλογής συνόλων και του χώρου αποθήκευσης BitMap:

τύπος δεδομένωνΚάθε userid καταλαμβάνει χώροΟ αριθμός των χρηστών που πρέπει να αποθηκευτούνΌλα απασχολούν τη μνήμη
βάζωΤα 32 bit είναι 4 byte (υποθέτοντας ότι το Userid χρησιμοποιεί ακέραιους αριθμούς, πολλοί ιστότοποι χρησιμοποιούν στην πραγματικότητα μεγάλους ακέραιους αριθμούς)50,000,00032 bit * 50.000.000 = 200 MB
Δυφιοαπεικόνιση1 κομμάτι100,000,0001 bit * 100.000.000 = 12,5 MB


Ο χρόνος τεντώνεται λίγο

Μια μέραΈνας μήναςΈνα έτος
βάζω200Λ72ΓΡ
Δυφιοαπεικόνιση12,5 εκατ.375Λ4,5 γρ


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

Το Redis παρέχει τις ακόλουθες οδηγίες για τη λειτουργία του BitMap:

εντολήδιευκρινίζωΔιαθέσιμες εκδόσειςΧρονική πολυπλοκότητα
Η σύνδεση με υπερσύνδεσμο είναι ορατή.Ορίστε ή διαγράψτε τα bit στην καθορισμένη μετατόπιση για την τιμή συμβολοσειράς που είναι αποθηκευμένη στο κλειδί.>= 2.2.0Ο(1)
Η σύνδεση με υπερσύνδεσμο είναι ορατή.Για την τιμή συμβολοσειράς που είναι αποθηκευμένη στο κλειδί, λάβετε τα bit στην καθορισμένη μετατόπιση.>= 2.2.0Ο(1)
Η σύνδεση με υπερσύνδεσμο είναι ορατή.Μετράει τον αριθμό των bit σε μια δεδομένη συμβολοσειρά που έχουν οριστεί σε 1.>= 2.6.0Ο(Ν)
Η σύνδεση με υπερσύνδεσμο είναι ορατή.Επιστρέφει τη θέση του δυαδικού bit στο bitmap όπου η πρώτη τιμή είναι bit.>= 2.8.7Ο(Ν)
Η σύνδεση με υπερσύνδεσμο είναι ορατή.Χειρισμός bit σε ένα ή περισσότερα πλήκτρα συμβολοσειράς που περιέχουν δυαδικά bit.>= 2.6.0Ο(Ν)
Η σύνδεση με υπερσύνδεσμο είναι ορατή.Η εντολή BITFIELD μπορεί να λειτουργήσει σε πολλαπλά εύρη bit ταυτόχρονα σε μία μόνο κλήση.>= 3.2.0Ο(1)


Τεκμηρίωση εντολών:Η σύνδεση με υπερσύνδεσμο είναι ορατή.

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

Σύνταξη SETBIT:Τιμή μετατόπισης κλειδιού SETBIT

Ορίστε το άρθρο id:9, 10, 156 σε 1 και η εντολή είναι η εξής:

Σύνταξη GETBIT: Μετατόπιση κλειδιού GETBIT

Για να προσδιορίσετε εάν υπάρχει το id: 10 ή το 11, η εντολή είναι η εξής:




Το .NET/C# χειρίζεται τον τύπο BitMap του Redis

Μάθαμε για πολλές εντολές BitMap στο redis και πώς να τις χειριζόμαστε μέσω προγραμματισμού. Δημιουργήστε ένα νέο έργο κονσόλας .NET 3.1, ανατρέξτε στο πακέτο StackExchange.Redis και χρησιμοποιήστε την ακόλουθη εντολή:

Ο πηγαίος κώδικας έχει ως εξής:



Υπάρχουν πολλά άλλα σενάρια εφαρμογής bitmap για το Redis, ως εξής:

  • Μπορεί να χρησιμοποιηθεί ως ένα απλό φίλτρο Bloom για να προσδιοριστεί εάν ένας χρήστης έχει εκτελέσει ορισμένες ενέργειες.
  • Στατιστικά στοιχεία της καθημερινής δραστηριότητας των χρηστών, της μηνιαίας δραστηριότητας και του ποσοστού διατήρησης
  • Συνειδητοποιήστε τα στατιστικά στοιχεία του αριθμού των εκκινήσεων χρηστών
  • Στατιστικά στοιχεία διαδικτυακής παρουσίας χρηστών και ατόμων

(Τέλος)




Προηγούμενος:Εικονικοί ηθοποιοί: Dapr vs Orleans
Επόμενος:Ανάλυση σφάλματος Alibaba Cloud SLB Load Balancing 503
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 2/1/2023 5:41:56 μ.μ. |
Δημοσιεύτηκε στις 2/1/2023 8:42:47 μ.μ. |
Έμαθα, ευχαριστώ και απέκτησα γνώσεις
Δημοσιεύτηκε στις 6/1/2023 8:34:22 μ.μ. |
Μαθαίνω να μαθαίνω
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com