Erstellen Sie mit Redis Geodaten-Apps

Für eine zunehmende Anzahl von Anwendungen ist die Verfolgung des Standorts unerlässlich. Eine soziale Anwendung kann Benutzer basierend auf dem Standort verbinden. Eine Hospitality- oder Reiseanwendung kann den Standort des Benutzers verwenden, um auf interessante Sehenswürdigkeiten hinzuweisen oder benutzerdefinierte Reiserouten bereitzustellen. Eine Sensoranwendung kann sowohl geografische als auch Zeitreihen speichern und analysieren, um eine Aktion wie das Erkennen von Mustern, Ausreißern und Anomalien auszulösen.

Mit zunehmender Reife der Geodaten-Technologie entwickeln sich standortbasierte Anwendungen von hauptsächlich Mapping-Anwendungen zu hoch entwickelten, hochmodernen Programmen, die Millionen von Datenpunkten von mobilen Benutzern, Sensornetzwerken, IoT-Geräten und anderen Quellen verarbeiten und analysieren. Die Welt ist in ständiger Bewegung und unsere Apps fangen an, sich durchzusetzen.

Standortdaten stellen eine interessante Herausforderung für den Entwickler dar, da bei der Abfrage oder Berechnung von Position und Entfernung Längengrad (x), Breitengrad (y) und manchmal sogar Höhe (z) berücksichtigt werden müssen. Die Mehrdimensionalität von Standortdaten erfordert optimierte Mechanismen, um sie zu verarbeiten. Die Behandlung als reine Ganzzahlen ist äußerst ineffizient. Wenn die Datenbank, ob ein RDBMS- oder ein NoSQL-Speicher, nicht über die Funktionen zum Verarbeiten von Geodaten verfügt, müssen Anwendungsprogrammierer die zusätzliche Arbeit der Vorverarbeitung der Daten erledigen oder eine Logik einbauen, die die Daten als Geodaten behandelt.

Die Verarbeitung von Geodaten ist auch eine Big-Data-Herausforderung in Echtzeit. Anwendungen, die Geodaten verwenden und verwalten, müssen bei minimaler Latenz eine hohe Anzahl von Standortanfragen („Wo bist du?“), Standortaktualisierungen („Ich bin hier“) und die Suche nach Daten nach Standort („Wer“) bedienen oder was ist in der Nähe? ”).

Einfache Lese- (Abrufort) und Schreibvorgänge (Aktualisierungsort) sind im Maßstab eine Herausforderung. Die Suche nach weiteren Verbindungen ist die Herausforderung. Der Schlüssel zur Erfüllung der oben genannten Anforderungen ist die Aufrechterhaltung effektiver Indizes für die Daten. Ein effektiver Index kann schnelle Suchvorgänge ermöglichen und ist nicht teuer in der Wartung (in Bezug auf Speicher und Rechenleistung).

Die Eigenschaften und die Leistung von Redis machen es zu einer hervorragenden Lösung für standortbasierte Anwendungen. Es fehlte lediglich die native Unterstützung für Geolokalisierungsdaten. Ab Version 3.2 verfügt Redis jedoch über eine integrierte Geodatenindizierung. Entwickler von Anwendungen, die auf Geodaten basieren, können sich jetzt an Redis wenden, um diese zu speichern, zu verarbeiten und zu analysieren - mit der Geschwindigkeit und Einfachheit, die sie bisher erreicht haben Erwarten Sie von Redis in anderen Anwendungen.

Kurze Einführung in Redis

Redis ist ein speicherinterner Datenstrukturspeicher, der üblicherweise als Datenbank, Cache und Nachrichtenbroker verwendet wird. Datenstrukturen in Redis ähneln Lego-Bausteinen und helfen Entwicklern, bestimmte Funktionen mit minimaler Komplexität zu erreichen. Redis minimiert auch den Netzwerk-Overhead und die Latenz, da Vorgänge im Speicher direkt neben dem Speicherort der Daten äußerst effizient ausgeführt werden.

Zu den Redis-Datenstrukturen gehören Hashes, Sets, sortierte Sets, Listen, Strings, Bitmaps und HyperLogLogs. Diese sind hochoptimiert und bieten jeweils spezielle Befehle, mit denen Sie komplexe Funktionen mit sehr wenig Code ausführen können. Diese Datenstrukturen machen Redis extrem leistungsfähig und ermöglichen es Redis-basierten Anwendungen, extreme Vorgänge mit sehr geringer Latenz zu verarbeiten.

Sortierte Sets sind besonders wichtig. Einzigartig für Redis, fügen sie den Mitgliedern eine geordnete Ansicht hinzu, sortiert nach Punktzahlen. Sortierte Sets sind für die Verarbeitung von Daten wie Geboten, Rängen, Benutzerpunkten und Zeitstempeln von großem Vorteil. So kann die Analyse im Vergleich zu normalen Schlüssel- / Wert- oder NoSQL-Speichern um einige Größenordnungen schneller durchgeführt werden.

Die Geospatial-Indizierung wird in Redis unter Verwendung von Sorted Sets als zugrunde liegende Datenstruktur implementiert, jedoch mit On-the-Fly-Codierung und -Decodierung von Standortdaten und neuen APIs. Dies bedeutet , dass standortspezifische Indexierung, Suche und Sortierung kann alle auf Redis mit wenigen Zeilen Code und sehr wenig Aufwand, mit integrierten Befehlen wie abgeladen werden GEOADD, GEODIST, GEORADIUS, und GEORADIUSBYMEMBER.

Wenn Sie diese räumliche Unterstützung mit anderen Redis-Funktionen kombinieren, lassen sich einige interessante Funktionen äußerst einfach implementieren. Durch das Zusammenführen der neuen Geo-Sets und PubSub ist es beispielsweise nahezu trivial, ein Echtzeit-Tracking-System einzurichten, bei dem jede Aktualisierung der Position eines Mitglieds an alle interessierten Parteien gesendet wird (denken Sie an eine Lauf- oder Fahrradgruppe, an der Sie möchten um die Standorte der Gruppenmitglieder in Echtzeit zu verfolgen).

Das Geo-Set

Das Geo-Set ist die Grundlage für die Arbeit mit Geodaten in Redis - es ist eine Datenstruktur, die auf die Verwaltung von Geodatenindizes spezialisiert ist. Jedes Geo-Set besteht aus einem oder mehreren Mitgliedern, wobei jedes Mitglied aus einer eindeutigen Kennung und einem Längen- / Breitengradpaar besteht. Ähnlich wie bei allen Datenstrukturen in Redis werden Geo-Sets mithilfe einer Teilmenge einfach zu verwendender und gleichzeitig hochoptimaler Befehle bearbeitet und abgefragt.

Intern werden Geo-Sets mit einem sortierten Set implementiert. Sortierte Sätze weisen ein gutes Raum-Zeit-Gleichgewicht auf, indem sie eine lineare Menge an RAM verbrauchen und gleichzeitig für die meisten Operationen eine logarithmische Rechenkomplexität bereitstellen.

Erstellen und Hinzufügen zum Index

Der Befehl Redis zum Hinzufügen von Mitgliedern zu einem Geoindex wird aufgerufen GEOADD. Dieser Befehl wird sowohl zum Erstellen neuer Sätze als auch zum Hinzufügen von Mitgliedern verwendet. Das folgende Beispiel, das über die Befehlszeile und den Node Redis-Client veranschaulicht wird, demonstriert seine Verwendung.

Beispiel für einen Redis-Befehl:

GEOADD locations 10.9971645 45.4435245 Romeo

Node Redis Beispiel:

redis.geoadd(‘locations’, ‘10.9971645’, ‘45.4435245’, ‘Romeo’);

Oben wird Redis angewiesen, ein Geo-Set mit dem Namen "Standorte" zum Speichern der Koordinaten des Mitglieds "Romeo" zu verwenden. Falls die Standortdatenstruktur nicht vorhanden ist, wird sie zuerst von Redis erstellt. Das neue Mitglied wird genau dann zum Index hinzugefügt, wenn es nicht im Satz vorhanden ist.

Es ist auch möglich, mit einem einzigen Aufruf mehrere Mitglieder zum Index hinzuzufügen GEOADD. Durch das Stapeln mehrerer Vorgänge in einem einzigen Befehl wird durch diese Form des Aufrufs die Datenbank und das Netzwerk entlastet.  

Beispiel für einen Redis-Befehl:

GEOADD locations 10.9971645 45.4435245 Mercutio 10.9962165 45.4419226 Juliet

Node Redis Beispiel:

redis.geoadd(‘locations’, ‘10.9971645’, ‘45.4435245’, ‘Mercutio’, ‘10.9962165’, ’45.4419226’, ‘Juliet’);

Index aktualisieren

Nachdem ein Mitglied und seine Koordinaten im Index aufgezeichnet wurden, können Sie mit Redis den Standort dieses Mitglieds aktualisieren. Das Aktualisieren von Mitgliedern in einem Geo-Set erfolgt durch Aufrufen des gleichen Befehls, mit dem sie hinzugefügt wurden, nämlich GEOADD. Wenn Sie mit vorhandenen Mitgliedern aufgerufen werden, werden GEOADDeinfach die räumlichen Daten aktualisiert, die jedem Mitglied mit den neuen Werten zugeordnet sind. Sobald Romeo das Haus verlässt, um seinen Abendspaziergang zu beginnen, kann sein aktualisierter Standort wie folgt aufgezeichnet werden.

Beispiel für einen Redis-Befehl:

GEOADD locations 10.999216 45.4432923 Romeo

Node Redis Beispiel:

redis.geoadd(‘locations’, ‘10.999216’, ‘45.4432923’, ‘Romeo’);

Mitglieder aus dem Index entfernen

Nach dem Hinzufügen zum Index müssen Mitglieder möglicherweise zu einem späteren Zeitpunkt aus dem Index gelöscht werden. Um das Löschen von Mitgliedern aus dem Geo-Set zu erleichtern, stellt Redis den ZREMBefehl bereit . Um ein Mitglied (oder Mitglieder) aus dem Satz zu löschen, ZREMwird mit dem entsprechenden Schlüsselnamen gefolgt von den zu löschenden Mitgliedern aufgerufen.

Beispiel für einen Redis-Befehl:

ZREM locations Mercutio

Node Redis Beispiel:

redis.zrem(‘locations’, ‘Mercutio’);

Der Geoindex kann vollständig gelöscht werden. Da der Index als Redis-Schlüssel gespeichert ist, DELkann er mit dem Befehl gelöscht werden.

Lesen aus dem Index

Die Daten in einem Geo Set-Index können auf verschiedene Arten gelesen werden. Erstens kann der Index zum Durchsuchen aller darin enthaltenen Elemente verwendet werden, sei es in einem großen Stapel oder in mehreren kleineren Blöcken. Redis bietet zwei Befehle, mit denen der gesamte Index durchlaufen werden kann: ZRANGEund ZSCAN. Da diese jedoch verwendet werden können, um alle indizierten Elemente abzudecken, ist diese Art des Zugriffs auf die Daten hauptsächlich für nicht kritische Offline-Vorgänge (z. B. ETL- und Berichterstellungsprozesse) reserviert.

Die zweite Art des Lesezugriffs auf den Index besteht darin, die Koordinaten der Mitglieder abzurufen und zu erreichen, dass Redis zwei Befehle bereitstellt. Der erste dieser Befehle GEOPOSgibt die Koordinaten für ein bestimmtes Mitglied in einem Geo-Set zurück. Unter der Annahme, dass Romeo seinen Weg einhält, wird die Antwort bezüglich seines aktuellen Aufenthaltsortes durch Ausführen der folgenden Schritte gegeben.

Beispiel für einen Redis-Befehl:

GEOPOS locations Romeo

1)     1) 10.999164

       2) 45.442681 

Node Redis Beispiel:

redis.geopos(‘locations’, ‘Romeo’, function(err, reply) {

});

Im obigen Beispiel ist die erste Zeile die Abfrage, während die folgenden Zeilen die Antwort der Datenbank sind. Redis stellt einen weiteren Befehl bereit GEOHASH, der die Standorte der Mitglieder meldet. Während beide praktisch dieselbe Funktion ausführen, besteht der Unterschied zwischen ihnen darin, dass die Ausgabe von GEOHASHals Standard-Geohash codiert wird (mehr zu Geohashes weiter unten).

Eine andere Verwendung für Daten, die im Index gespeichert sind, ist die Berechnung der Abstände zwischen Mitgliedern. Für zwei beliebige Mitglieder im Geo-Set GEODISTberechnet der Befehl den Abstand zwischen ihnen und gibt ihn zurück.

Index durchsuchen

Die letzte und vielleicht nützlichste Art des Lesezugriffs, die der Geoindex ermöglicht, ist die Suche der Daten nach ihrem Standort. Das häufigste Beispiel für solche Suchvorgänge ist das Auffinden indizierter Mitglieder in einer bestimmten Entfernung von einem bestimmten Ort. Zu diesem Zweck stellt Redis den GEORADIUSBefehl zur Verfügung.

Wie der Name schon sagt, GEORADIUSführt eine Suche innerhalb eines Kreises durch, der durch seinen Mittelpunkt und seinen Radius gegeben ist, und gibt die Elemente zurück, die in ihn fallen. Ein anderer Redis-Befehl GEORADIUSBYMEMBERdient demselben Zweck, akzeptiert jedoch eines der indizierten Elemente als Mittelpunkt des Kreises. Das Folgende ist ein Beispiel für eine solche Suche.

Beispiel für einen Redis-Befehl:

GEORADIUSBYMEMBER locations Romeo 100 m

1) “Juliet”

Node Redis Beispiel:

redis.georadiusbymember(‘locations’, ‘Romeo’, ‘100’, ‘m’, function(err, reply) {

});

Der Suchbefehl unterstützt auch das Sortieren der Antworten vom nächsten zum am weitesten entfernten (Standard) oder umgekehrt sowie das Zurückgeben des Standorts und der Entfernung jeder Antwort. Redis ermöglicht auch das Speichern der Antwort in einem anderen Satz zur weiteren Verarbeitung (z. B. Paging- und Satzoperationen).

Redis für Geodaten

Die Einfachheit der Implementierung standortbasierter Funktionen in Redis bedeutet, dass Sie nicht nur die Flut von Geodaten problemlos bewältigen können, sondern neben der einfachen Verarbeitung auch Informationen implementieren können. Mit der integrierten Radiusabfrage können Sie beispielsweise einfache Funktionen wie "Objekte in der Nähe" implementieren, ohne Ihren Benutzer oder Ihre Anwendung mit zu vielen Auswahlmöglichkeiten zu überladen. Durch das Festlegen von Kreuzungsoperationen können Sie „Elemente von Interesse“ anhand mehrerer Filter wie geografischer Standort, Benutzereigenschaften und Einstellungen isolieren.

Ein weiterer Effizienzvorteil ergibt sich aus der Art und Weise, wie Redis Geo-Sets implementiert werden. Geo-Sets in Redis sind einfach eine andere Version der leistungsstarken sortierten Sets, mit dem Hauptunterschied, dass Geo-Sets geohashden Längen- und Breitengrad eines Standorts als Punktzahl verwenden (plus für den Benutzer transparente On-the-Fly-Codierung und -Decodierung). Geohashing, ein von Gustavo Niemeyer erfundenes System, ermöglicht auch eine äußerst effiziente Suche. Der gesamte Ortskoordinatensatz muss nicht bei jeder Berechnung der Entfernung verglichen werden. Die Darstellung stellt sicher, dass die Suche leicht eingeschränkt werden kann und somit sowohl zeit- als auch räumlich effizient wird.

Andere verfügbare Bibliotheken bieten interessante Funktionen, z. B. die Einbeziehung der Höhe in Berechnungen. Beispielsweise können Sie eine Drohne oder eine Gruppe von Drohnen in verschiedenen Höhen verfolgen und Sensoren tragen, die Windverhältnisse oder Temperaturunterschiede an einem Ort messen. Die erforderliche Kombination aus Sets und sortierten Sets finden Sie in dieser xyzsets-API in der auf GitHub verfügbaren Geo Lua-Bibliothek.

Pfadlängenberechnungen, die normalerweise für die Navigation zwischen Wegpunkten zu bestimmten Zielen erforderlich sind, können mit der Geopathlen-API problemlos durchgeführt werden. Echtzeitverfolgung ist mit dieser API für Standortaktualisierungen einfach zu implementieren.

Wenn Ihre Anwendung Standortdaten in irgendeiner Weise verwendet, sollten Sie einen Großteil der harten Arbeit nach Redis verlagern. Bei sehr großen Datenmengen ist die Verwendung von Redis on Flash möglicherweise kostengünstiger. Dabei wird eine Kombination aus RAM und Flash-Speicher verwendet, um den für Redis charakteristischen extremen Durchsatz und die für Redis charakteristische Latenz von Submillisekunden zu erzielen. Weitere technische Details zur Verwendung von Redis für Geodaten, einschließlich Geohash-Suche und erweiterte Funktionen mit Lua, finden Sie im Whitepaper Redis für Geodaten.

Itamar Haber ist Chefentwickler für Redis Labs.

Das New Tech Forum bietet einen Ort, an dem Sie neue Unternehmenstechnologien in beispielloser Tiefe und Breite erkunden und diskutieren können. Die Auswahl ist subjektiv, basierend auf unserer Auswahl der Technologien, die wir für wichtig und für die Leser von größtem Interesse halten. akzeptiert keine Marketingmaterialien zur Veröffentlichung und behält sich das Recht vor, alle eingebrachten Inhalte zu bearbeiten. Senden Sie alle Anfragen an [email protected]