Προγραμματισμός

Δημιουργήστε γεωχωρικές εφαρμογές με το Redis

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

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

Τα δεδομένα τοποθεσίας αποτελούν μια ενδιαφέρουσα πρόκληση για τον προγραμματιστή, επειδή το ερώτημα ή η πραγματοποίηση υπολογισμών θέσης και απόστασης πρέπει να λαμβάνει υπόψη το μήκος (x), το πλάτος (y) και μερικές φορές ακόμη και το υψόμετρο (z). Η πολυδιάστατη φύση των δεδομένων θέσης απαιτεί βελτιστοποιημένους μηχανισμούς για την επεξεργασία τους - η αντιμετώπισή τους ως απλώς ακέραιοι είναι εξαιρετικά αναποτελεσματική. Εάν η βάση δεδομένων, είτε ένα RDBMS είτε ένα κατάστημα NoSQL, δεν διαθέτει τις δυνατότητες χειρισμού γεωχωρικών δεδομένων, οι προγραμματιστές εφαρμογών πρέπει να κάνουν το επιπλέον έργο της προεπεξεργασίας των δεδομένων ή πρέπει να δημιουργήσουν λογική που αντιμετωπίζει τα δεδομένα ως γεωχωρικά.

Η επεξεργασία γεωχωρικών δεδομένων είναι επίσης μια πρόκληση δεδομένων σε πραγματικό χρόνο. Οι εφαρμογές που χρησιμοποιούν και διαχειρίζονται γεωχωρικά δεδομένα πρέπει να εξυπηρετούν, με ελάχιστη καθυστέρηση, μεγάλο αριθμό αιτημάτων για τοποθεσία ("Πού βρίσκεστε;"), ενημερώσεις στην τοποθεσία ("Είμαι εδώ") και αναζητήσεις δεδομένων ανά τοποθεσία ("Ποιος ή τι είναι κοντά; »).

Οι απλές αναγνώσεις (τοποθεσία λήψης) και οι εγγραφές (τοποθεσία ενημέρωσης) είναι προκλητικές σε κλίμακα. Η αναζήτηση περαιτέρω επιδεινώνει την πρόκληση. Το κλειδί για την ικανοποίηση των παραπάνω απαιτήσεων είναι η διατήρηση αποτελεσματικών ευρετηρίων για τα δεδομένα. Ένα αποτελεσματικό ευρετήριο είναι αυτό που μπορεί να διευκολύνει γρήγορες αναζητήσεις και δεν είναι ακριβό να διατηρηθεί (όσον αφορά τη μνήμη και την υπολογιστική ισχύ).

Τα χαρακτηριστικά και η απόδοση του Redis το καθιστούν ιδανικό για εφαρμογές βάσει τοποθεσίας. Το μόνο που έλειπε ήταν η εγγενής υποστήριξη για δεδομένα γεωγραφικής τοποθεσίας. Ξεκινώντας από την έκδοση 3.2, ωστόσο, το Redis διαθέτει ενσωματωμένη γεωγραφική ευρετηρίαση. Οι προγραμματιστές εφαρμογών που βασίζονται σε γεωχωρικά δεδομένα μπορούν τώρα να κοιτάξουν τον Redis για αποθήκευση, επεξεργασία και ανάλυση - με όλη την ταχύτητα και την απλότητα που έχουν φτάσει περιμένετε από το Redis σε άλλες εφαρμογές.

Σύντομη εισαγωγή στο Redis

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

Οι δομές δεδομένων Redis περιλαμβάνουν Hash, Sets, Sorted Sets, Lists, String, Bitmaps και HyperLogLogs. Αυτά είναι εξαιρετικά βελτιστοποιημένα, το καθένα παρέχει εξειδικευμένες εντολές που σας βοηθούν να εκτελέσετε σύνθετες λειτουργίες με πολύ λίγο κώδικα. Αυτές οι δομές δεδομένων καθιστούν το Redis εξαιρετικά ισχυρό και επιτρέπουν σε εφαρμογές που βασίζονται στο Redis να χειρίζονται ακραίες ποσότητες λειτουργιών σε πολύ χαμηλό λανθάνοντα χρόνο.

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

Η γεωχωρική ευρετηρίαση εφαρμόζεται στο Redis χρησιμοποιώντας τα Ταξινομημένα σύνολα ως την υποκείμενη δομή δεδομένων, αλλά με κρυπτογράφηση και αποκωδικοποίηση εν κινήσει δεδομένων δεδομένων και νέων API. Αυτό σημαίνει ότι η συγκεκριμένη τοποθεσία ευρετηρίαση, αναζήτηση και ταξινόμηση μπορεί να φορτωθεί στο Redis, με πολύ λίγες γραμμές κώδικα και πολύ λίγη προσπάθεια, χρησιμοποιώντας ενσωματωμένες εντολές όπως GEOADD, ΓΕΩΔΙΣΤΟΣ, ΓΕΩΡΑΔΙΟΣ, και ΓΕΩΡΑΔΙΟΣΜΠΥΜΒΕΛΟΣ.

Όταν συνδυάζετε αυτήν τη γεωχωρική υποστήριξη με άλλες δυνατότητες Redis, κάποια ενδιαφέρουσα λειτουργικότητα γίνεται εξαιρετικά απλή στην εφαρμογή. Για παράδειγμα, συνδυάζοντας τα νέα Geo Sets και PubSub, είναι σχεδόν ασήμαντο να δημιουργηθεί ένα σύστημα παρακολούθησης σε πραγματικό χρόνο στο οποίο κάθε ενημέρωση για τη θέση ενός μέλους αποστέλλεται σε όλα τα ενδιαφερόμενα μέρη (σκεφτείτε μια ομάδα για τρέξιμο ή ποδηλασία όπου θέλετε για παρακολούθηση των τοποθεσιών των μελών της ομάδας σε πραγματικό χρόνο).

Το γεωγραφικό σύνολο

Το Geo Set είναι η βάση για την εργασία με γεωχωρικά δεδομένα στο Redis - είναι μια δομή δεδομένων που είναι εξειδικευμένη για τη διαχείριση γεωχωρικών δεικτών. Κάθε σύνολο Geo αποτελείται από ένα ή περισσότερα μέλη, με κάθε μέλος να αποτελείται από ένα μοναδικό αναγνωριστικό και ένα ζεύγος γεωγραφικού μήκους / πλάτους. Παρόμοια με όλες τις δομές δεδομένων στο Redis, τα Geo Sets υποβάλλονται σε επεξεργασία και υποβάλλονται σε ερώτηση χρησιμοποιώντας ένα υποσύνολο απλών προς χρήση και ταυτόχρονα εξαιρετικά βέλτιστων εντολών.

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

Δημιουργία και προσθήκη στο ευρετήριο

Η εντολή Redis για την προσθήκη μελών σε ένα γεωχωρικό ευρετήριο καλείται GEOADD. Αυτή η εντολή χρησιμοποιείται τόσο για τη δημιουργία νέων συνόλων όσο και για την προσθήκη μελών. Το ακόλουθο παράδειγμα, που απεικονίζεται από τη γραμμή εντολών και τον πελάτη Node Redis, δείχνει τη χρήση του.

Παράδειγμα εντολής Redis:

Τοποθεσίες GEOADD 10.9971645 45.4435245 Romeo

Παράδειγμα κόμβου Redis:

redis.geoadd ("τοποθεσίες", "10 .9971645", "45 .4435245", "Romeo");

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

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

Παράδειγμα εντολής Redis:

Τοποθεσίες GEOADD 10.9971645 45.4435245 Mercutio 10.9962165 45.4419226 Juliet

Παράδειγμα κόμβου Redis:

redis.geoadd ("τοποθεσίες", "10 .9971645", "45 .4435245", "Mercutio", "10 .9962165", "45 .4419226", "Juliet");

Ενημέρωση του ευρετηρίου

Αφού ένα μέλος και οι συντεταγμένες του έχουν καταγραφεί στο ευρετήριο, το Redis σάς επιτρέπει να ενημερώσετε την τοποθεσία αυτού του μέλους. Η ενημέρωση των μελών σε ένα Geo Set γίνεται καλώντας την ίδια εντολή που χρησιμοποιήθηκε για την προσθήκη τους, δηλαδή GEOADD. Όταν καλείται με υπάρχοντα μέλη, GEOADD απλώς ενημερώνει τα χωρικά δεδομένα που σχετίζονται με κάθε μέλος με τις νέες τιμές. Ως εκ τούτου, μόλις ο Romeo βγει από το σπίτι για να ξεκινήσει την βραδινή του βόλτα, η ενημερωμένη τοποθεσία του μπορεί να καταγραφεί με τα ακόλουθα.

Παράδειγμα εντολής Redis:

Τοποθεσίες GEOADD 10.999216 45.4432923 Romeo

Παράδειγμα κόμβου Redis:

redis.geoadd ("τοποθεσίες", "10 .999216", "45 .4432923", "Romeo");

Κατάργηση μελών από το ευρετήριο

Αφού προστεθούν στο ευρετήριο, τα μέλη ενδέχεται να χρειαστεί να διαγραφούν από αυτό αργότερα. Για να διευκολυνθεί η διαγραφή μελών από το Geo Set, το Redis παρέχει το ZREM εντολή. Για να διαγράψετε ένα μέλος (ή μέλη) από το σετ, ZREM καλείται με το κατάλληλο όνομα κλειδιού ακολουθούμενο από τα μέλη που πρέπει να διαγραφούν από αυτό.

Παράδειγμα εντολής Redis:

Το ZREM τοποθετεί το Mercutio

Παράδειγμα κόμβου Redis:

redis.zrem («τοποθεσίες», «Mercutio»);

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

Ανάγνωση από το ευρετήριο

Τα δεδομένα σε ένα ευρετήριο Geo Set μπορούν να διαβαστούν με διάφορους τρόπους. Πρώτον, το ευρετήριο μπορεί να χρησιμοποιηθεί για σάρωση σε όλα τα μέλη σε αυτό, είτε σε μια μεγάλη παρτίδα είτε σε πολλά μικρότερα κομμάτια. Το Redis παρέχει δύο εντολές που μπορούν να χρησιμοποιηθούν για επαναλήψεις σε ολόκληρο το ευρετήριο: ΖΩΝΗ και ZSCAN. Ωστόσο, επειδή αυτά μπορούν να χρησιμοποιηθούν για την κάλυψη όλων των ευρετηριασμένων στοιχείων, αυτός ο τύπος πρόσβασης στα δεδομένα προορίζεται ως επί το πλείστον για offline, μη κρίσιμες λειτουργίες (για παράδειγμα, ETL και διαδικασίες αναφοράς).

Ο δεύτερος τύπος πρόσβασης ανάγνωσης στο ευρετήριο είναι για τη λήψη συντεταγμένων μελών και για να επιτευχθεί αυτό το Redis παρέχει δύο εντολές. Η πρώτη από αυτές τις εντολές είναι ΓΕΩΠΟΣ, που επιστρέφει τις συντεταγμένες για ένα δεδομένο μέλος σε ένα σύνολο γεωγραφικών. Υποθέτοντας ότι ο Romeo ακολουθεί τον περίπατό του, η απάντηση σχετικά με την τρέχουσα τοποθεσία του παρέχεται εκτελώντας τα ακόλουθα.

Παράδειγμα εντολής Redis:

Η GEOPOS τοποθετεί το Romeo

1)     1) 10.999164

       2) 45.442681 

Παράδειγμα κόμβου Redis:

redis.geopos («τοποθεσίες», «Romeo», λειτουργία (err, απάντηση) {

});

Στο παραπάνω παράδειγμα, η πρώτη γραμμή είναι το ερώτημα, ενώ οι ακόλουθες γραμμές είναι η απάντηση της βάσης δεδομένων. Το Redis παρέχει μια άλλη εντολή που ονομάζεται GEOHASH που αναφέρει τις τοποθεσίες των μελών. Ενώ και οι δύο εκτελούν πρακτικά την ίδια λειτουργία, η διαφορά μεταξύ τους είναι ότι η έξοδος του GEOHASH κωδικοποιείται ως τυπικό geohash (περισσότερα για geohash παρακάτω).

Μια άλλη χρήση για δεδομένα που αποθηκεύονται στο ευρετήριο είναι ο υπολογισμός των αποστάσεων μεταξύ των μελών. Για οποιαδήποτε δύο μέλη στο Geo Set, το ΓΕΩΔΙΣΤΟΣ Η εντολή θα υπολογίσει και θα επιστρέψει την απόσταση μεταξύ τους.

Αναζήτηση στο ευρετήριο

Ο τελευταίος και ίσως ο πιο χρήσιμος τύπος πρόσβασης ανάγνωσης που επιτρέπει ο γεωχωρικός δείκτης είναι η αναζήτηση των δεδομένων από τη θέση του. Το πιο κοινό παράδειγμα τέτοιων αναζητήσεων είναι η εύρεση ευρετηριασμένων μελών σε μια συγκεκριμένη απόσταση από μια δεδομένη τοποθεσία. Για το σκοπό αυτό, η Redis παρέχει το ΓΕΩΡΑΔΙΟΣ εντολή.

Όπως υποδηλώνει το όνομα, ΓΕΩΡΑΔΙΟΣ εκτελεί αναζήτηση μέσα σε έναν κύκλο που δίνεται από το κέντρο και την ακτίνα του και επιστρέφει τα μέλη που πέφτουν μέσα σε αυτό. Μια άλλη εντολή Redis, ΓΕΩΡΑΔΙΟΣΜΠΥΜΒΕΛΟΣ, εξυπηρετεί τον ίδιο σκοπό αλλά δέχεται ένα από τα ευρετήρια μέλη ως το κέντρο του κύκλου. Το παρακάτω είναι ένα παράδειγμα μιας τέτοιας αναζήτησης.

Παράδειγμα εντολής Redis:

GEORADIUSBYMEMBER τοποθεσίες Romeo 100 μ

1) «Ιουλιέτα»

Παράδειγμα κόμβου Redis:

redis.georadiusbymember ("τοποθεσίες", "Romeo", "100", "m", λειτουργία (err, απάντηση) {

});

Η εντολή αναζήτησης υποστηρίζει επίσης την ταξινόμηση των απαντήσεων από το πλησιέστερο στο πιο μακρινό (η προεπιλογή) ή το αντίστροφο, καθώς και την επιστροφή της θέσης και της απόστασης κάθε απάντησης. Το Redis επιτρέπει επίσης την αποθήκευση της απάντησης σε ένα άλλο σύνολο για περαιτέρω επεξεργασία (όπως σελιδοποίηση και λειτουργίες Set).

Επανάκληση για γεωχωρικά δεδομένα

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

Ένα άλλο όφελος στην αποδοτικότητα προκύπτει από τον τρόπο υλοποίησης των σετ Redis Geo. Τα γεωγραφικά σύνολα στο Redis είναι απλά μια άλλη έκδοση των ισχυρών ταξινομημένων συνόλων, με τη βασική διαφορά που χρησιμοποιούν τα Geo Sets geohash του γεωγραφικού μήκους και πλάτους μιας τοποθεσίας ως η βαθμολογία της (συν κωδικοποίηση και αποκωδικοποίηση εν κινήσει που είναι διαφανής για τον χρήστη). Το Geohashing, ένα σύστημα που εφευρέθηκε από τον Gustavo Niemeyer, καθιστά επίσης δυνατή την εξαιρετικά αποτελεσματική αναζήτηση. Το σύνολο συντεταγμένων τοποθεσίας δεν χρειάζεται να συγκρίνεται κάθε υπολογισμένη απόσταση. Η αναπαράσταση διασφαλίζει ότι οι αναζητήσεις μπορούν να περιοριστούν εύκολα και επομένως να γίνουν αποδοτικές τόσο στο χρόνο όσο και στο χώρο

Άλλες διαθέσιμες βιβλιοθήκες προσθέτουν ενδιαφέρουσες δυνατότητες, όπως η ανύψωση στους υπολογισμούς. Για παράδειγμα, μπορεί να παρακολουθείτε ένα drone ή μια ομάδα drone σε διαφορετικά υψόμετρα, με αισθητήρες που μετρούν τις συνθήκες του ανέμου ή τις διαφορές θερμοκρασίας σε μια τοποθεσία. Ο απαιτούμενος συνδυασμός των συνόλων και των ταξινομημένων συνόλων παρέχεται σε αυτό το xyzsets API στη βιβλιοθήκη Geo Lua που διατίθεται στο GitHub.

Οι υπολογισμοί μήκους διαδρομής, που συνήθως απαιτούνται για την πλοήγηση μεταξύ σημείων προς συγκεκριμένους προορισμούς, μπορούν εύκολα να πραγματοποιηθούν με το API geopathlen. Η παρακολούθηση σε πραγματικό χρόνο εφαρμόζεται εύκολα με αυτό το API ενημερώσεων τοποθεσίας.

Εάν η εφαρμογή σας χρησιμοποιεί δεδομένα τοποθεσίας με οποιονδήποτε τρόπο, σκεφτείτε να εκφορτώσετε πολύ σκληρή δουλειά στο Redis. Για πολύ μεγάλα σύνολα δεδομένων, μπορεί να είναι πιο οικονομικό να χρησιμοποιήσετε το Redis στο Flash, το οποίο χρησιμοποιεί έναν συνδυασμό μνήμης RAM και μνήμης flash για την παράδοση της ακραίας απόδοσης και των δευτερευόντων δευτερολέπτων λανθάνων χαρακτηριστικών του Redis. Για περισσότερες τεχνικές λεπτομέρειες σχετικά με τη χρήση του Redis για γεωχωρικά δεδομένα, συμπεριλαμβανομένης της αναζήτησης geohash και προηγμένων δυνατοτήτων με τη Lua, ανατρέξτε στη Λευκή Βίβλο Redis for Geospatial Data.

Ο Itamar Haber είναι επικεφαλής υπερασπιστής του Redis Labs.

Το New Tech Forum παρέχει έναν χώρο για να εξερευνήσετε και να συζητήσετε την αναδυόμενη τεχνολογία σε πρωτοφανές βάθος και εύρος. Η επιλογή είναι υποκειμενική, με βάση την επιλογή των τεχνολογιών που πιστεύουμε ότι είναι σημαντικές και έχουν μεγάλο ενδιαφέρον για τους αναγνώστες. δεν αποδέχεται ασφάλεια μάρκετινγκ για δημοσίευση και διατηρεί το δικαίωμα να επεξεργαστεί όλο το περιεχόμενο. Στείλτε όλες τις ερωτήσεις στο [email protected]