Créez des applications géospatiales avec Redis

Pour un nombre croissant d'applications, le suivi de l'emplacement est essentiel. Une application sociale peut connecter les utilisateurs en fonction de leur emplacement. Une application d'hospitalité ou de voyage peut utiliser la localisation de l'utilisateur pour signaler des sites intéressants ou proposer des itinéraires personnalisés. Une application de capteur peut stocker et analyser des données à la fois géospatiales et chronologiques, pour déclencher une action telle que la détection de modèles, de valeurs aberrantes et d'anomalies.

En outre, au fur et à mesure que la technologie géospatiale mûrit, les applications basées sur la localisation évoluent, passant principalement d'applications de cartographie à des programmes sophistiqués et de pointe qui traitent et analysent des millions de points de données d'utilisateurs mobiles, de réseaux de capteurs, d'appareils IoT et d'autres sources. Le monde est en mouvement constant et nos applications commencent à se répandre.

Les données de localisation présentent un défi intéressant pour le développeur, car les interroger ou effectuer des calculs de position et de distance doivent prendre en compte la longitude (x), la latitude (y) et parfois même l'élévation (z). La nature multidimensionnelle des données de localisation nécessite des mécanismes optimisés pour les traiter - les traiter comme de simples entiers est très inefficace. Si la base de données, qu'il s'agisse d'un SGBDR ou d'un magasin NoSQL, n'a pas les capacités de gestion des données géospatiales, les programmeurs d'application doivent faire le travail supplémentaire de prétraitement des données, ou ils doivent intégrer une logique qui traite les données comme géospatiales.

Le traitement des données géospatiales est également un défi de Big Data en temps réel. Les applications qui utilisent et gèrent des données géospatiales doivent répondre, avec une latence minimale, à un nombre élevé de demandes de localisation ("Où êtes-vous?"), De mises à jour de localisation ("Je suis ici") et de recherches de données par localisation ("Qui ou qu'est-ce qui se trouve à proximité? »).

Les lectures simples (extraction de l'emplacement) et les écritures (emplacement de mise à jour) sont difficiles à l'échelle. La recherche supplémentaire complique le défi. La clé pour satisfaire les exigences ci-dessus est de maintenir des index efficaces pour les données. Un index efficace est celui qui peut faciliter des recherches rapides et qui n'est pas coûteux à maintenir (en termes de mémoire et de puissance de calcul).

Les caractéristiques et les performances de Redis en font un excellent choix pour les applications géolocalisées. Tout ce qui manquait était la prise en charge native des données de géolocalisation. Cependant, à partir de la version 3.2, Redis intègre l'indexation géospatiale. Les développeurs d'applications qui s'appuient sur des données géospatiales peuvent désormais se tourner vers Redis pour les stocker, les traiter et les analyser, avec toute la vitesse et la simplicité auxquelles ils sont parvenus. attendez de Redis dans d'autres applications.

Brève introduction à Redis

Redis est un magasin de structures de données en mémoire couramment utilisé comme base de données, cache et courtier de messages. Les structures de données dans Redis sont comme des blocs de construction Lego, aidant les développeurs à atteindre des fonctionnalités spécifiques avec une complexité minimale. Redis minimise également la surcharge et la latence du réseau car les opérations sont exécutées de manière extrêmement efficace en mémoire, juste à côté de l'endroit où les données sont stockées.

Les structures de données Redis incluent les hachages, les ensembles, les ensembles triés, les listes, les chaînes, les bitmaps et les HyperLogLogs. Ils sont hautement optimisés, chacun fournissant des commandes spécialisées qui vous aident à exécuter des fonctionnalités complexes avec très peu de code. Ces structures de données rendent Redis extrêmement puissant et permettent aux applications basées sur Redis de gérer des volumes extrêmes d'opérations avec une latence très faible.

Les ensembles triés sont particulièrement importants. Unique à Redis, ils ajoutent une vue ordonnée aux membres, triés par scores. Les ensembles triés sont extrêmement avantageux pour traiter des données telles que les enchères, les classements, les points d'utilisateur et les horodatages - permettant une analyse de quelques ordres de grandeur plus rapide par rapport aux magasins de clés / valeurs ordinaires ou de NoSQL.

L'indexation géospatiale est implémentée dans Redis en utilisant des ensembles triés comme structure de données sous-jacente, mais avec un encodage et un décodage à la volée des données de localisation et de nouvelles API. Cela signifie que l' indexation spécifique à l' emplacement, la recherche et le tri peuvent tous être débarquées à Redis, avec très peu de lignes de code et très peu d' effort, en utilisant les commandes intégrées comme GEOADD, GEODIST, GEORADIUSet GEORADIUSBYMEMBER.

Lorsque vous combinez cette prise en charge géospatiale avec d'autres fonctionnalités Redis, certaines fonctionnalités intéressantes deviennent extrêmement simples à implémenter. Par exemple, en fusionnant les nouveaux Geo Sets et PubSub, il est presque trivial de mettre en place un système de suivi en temps réel dans lequel chaque mise à jour de la position d'un membre est envoyée à toutes les parties intéressées (pensez à un groupe de course ou de vélo où vous voulez pour suivre les emplacements des membres du groupe en temps réel).

L'ensemble Geo

Le Geo Set est la base pour travailler avec des données géospatiales dans Redis - c'est une structure de données spécialisée pour la gestion des indices géospatiaux. Chaque Geo Set est composé d'un ou plusieurs membres, chaque membre étant constitué d'un identifiant unique et d'une paire longitude / latitude. Semblable à toutes les structures de données de Redis, les Geo Sets sont manipulés et interrogés à l'aide d'un sous-ensemble de commandes simples à utiliser et en même temps hautement optimales.

En interne, les ensembles géographiques sont implémentés avec un ensemble trié. Les ensembles triés présentent un bon équilibre espace-temps en consommant une quantité linéaire de RAM tout en offrant une complexité de calcul logarithmique pour la plupart des opérations.

Création et ajout à l'index

La commande Redis pour ajouter des membres à un index géospatial est appelée GEOADD. Cette commande est utilisée à la fois pour créer de nouveaux ensembles et pour ajouter des membres. L'exemple suivant, illustré à partir de la ligne de commande et du client Node Redis, illustre son utilisation.

Exemple de commande Redis:

GEOADD locations 10.9971645 45.4435245 Romeo

Exemple de Node Redis:

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

Ce qui précède indique à Redis d'utiliser un ensemble géographique appelé emplacements pour stocker les coordonnées du membre nommé Romeo. Si la structure de données des emplacements n'existe pas, elle sera d'abord créée par Redis. Le nouveau membre sera ajouté à l'index si et seulement s'il n'existe pas dans l'ensemble.

Il est également possible d'ajouter plusieurs membres à l'index avec un seul appel à GEOADD. En regroupant plusieurs opérations en une seule commande, cette forme d'appel réduit la charge sur la base de données et le réseau.  

Exemple de commande Redis:

GEOADD locations 10.9971645 45.4435245 Mercutio 10.9962165 45.4419226 Juliet

Exemple de Node Redis:

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

Mettre à jour l'index

Une fois qu'un membre et ses coordonnées ont été enregistrés dans l'index, Redis vous permet de mettre à jour l'emplacement de ce membre. La mise à jour des membres dans un Geo Set se fait en appelant la même commande utilisée pour les ajouter, à savoir GEOADD. Lorsqu'il est appelé avec des membres existants, GEOADDmet simplement à jour les données spatiales associées à chaque membre avec les nouvelles valeurs. Par conséquent, une fois que Roméo quitte la maison pour commencer sa promenade du soir, son emplacement mis à jour peut être enregistré avec ce qui suit.

Exemple de commande Redis:

GEOADD locations 10.999216 45.4432923 Romeo

Exemple de Node Redis:

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

Suppression de membres de l'index

Après avoir été ajoutés à l'index, les membres devront peut-être en être supprimés ultérieurement. Pour faciliter la suppression des membres du Geo Set, Redis fournit la ZREMcommande. Pour supprimer un membre (ou des membres) de l'ensemble, ZREMest appelé avec le nom de clé approprié suivi des membres à supprimer.

Exemple de commande Redis:

ZREM locations Mercutio

Exemple de Node Redis:

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

L'indice géospatial peut être entièrement supprimé. Puisque l'index est stocké en tant que clé Redis, la DELcommande peut être utilisée pour le supprimer.

Lecture à partir de l'index

Les données d'un index Geo Set peuvent être lues de plusieurs manières. Premièrement, l'index peut être utilisé pour parcourir tous les membres qu'il contient, que ce soit en un seul gros lot ou en plusieurs petits morceaux. Redis fournit deux commandes qui peuvent être utilisées pour itérer dans tout l'index: ZRANGEet ZSCAN. Cependant, comme ceux-ci peuvent être utilisés pour couvrir tous les éléments indexés, ce type d'accès aux données est principalement réservé aux opérations non critiques hors ligne (par exemple, ETL et processus de reporting).

Le deuxième type d'accès en lecture à l'index est pour récupérer les coordonnées des membres, et pour cela, Redis fournit deux commandes. La première de ces commandes est GEOPOS, qui renvoie les coordonnées d'un membre donné dans un ensemble géographique. En supposant que Roméo suit sa marche, la réponse concernant sa localisation actuelle est fournie en exécutant ce qui suit.

Exemple de commande Redis:

GEOPOS locations Romeo

1)     1) 10.999164

       2) 45.442681 

Exemple de Node Redis:

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

});

Dans l'exemple ci-dessus, la première ligne est la requête, tandis que les lignes suivantes sont la réponse de la base de données. Redis fournit une autre commande appelée GEOHASHqui rapporte les emplacements des membres. Bien que les deux remplissent pratiquement la même fonction, la différence entre eux est que la sortie de GEOHASHest codée en tant que geohash standard (plus d'informations sur les geohashes ci-dessous).

Une autre utilisation des données stockées dans l'index est le calcul des distances entre les membres. Pour deux membres du Geo Set, la GEODISTcommande calculera et retournera la distance entre eux.

Recherche dans l'index

Le dernier type d'accès en lecture, et peut-être le plus utile, que l'index géospatial permet est de rechercher les données par leur emplacement. L'exemple le plus courant de telles recherches est la recherche de membres indexés à une certaine distance d'un emplacement donné. Pour cela, Redis fournit la GEORADIUScommande.

Comme son nom l'indique, GEORADIUSeffectue une recherche dans un cercle donné par son centre et son rayon et renvoie les membres qui se trouvent à l'intérieur. Une autre commande Redis,, GEORADIUSBYMEMBERsert le même objectif mais accepte l'un des membres indexés comme centre du cercle. Voici un exemple d'une telle recherche.

Exemple de commande Redis:

GEORADIUSBYMEMBER locations Romeo 100 m

1) “Juliet”

Exemple de Node Redis:

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

});

La commande de recherche prend également en charge le tri des réponses du plus proche au plus éloigné (par défaut) ou vice versa, ainsi que le renvoi de l'emplacement et de la distance de chaque réponse. Redis permet également de stocker la réponse dans un autre ensemble pour un traitement ultérieur (comme la pagination et les opérations Set).

Redis pour les données géospatiales

La simplicité de mise en œuvre de la fonctionnalité basée sur la localisation dans Redis signifie que vous pouvez non seulement gérer facilement le flot de données géographiques, mais également implémenter l'intelligence en plus d'un traitement simple. Par exemple, la requête de rayon intégrée peut vous aider à mettre en œuvre des fonctionnalités simples telles que les «éléments d'intérêt à proximité» sans submerger votre utilisateur ou votre application avec trop de choix. Les opérations de définition des intersections peuvent vous aider à isoler les «éléments d'intérêt» en fonction de plusieurs filtres comme l'emplacement géographique, les caractéristiques de l'utilisateur et les préférences.

Un autre avantage en termes d'efficacité provient de la manière dont les ensembles Redis Geo sont mis en œuvre. Les Geo Sets dans Redis sont simplement une autre version des puissants ensembles triés, avec la différence clé que les Geo Sets utilisent la geohashlongitude et la latitude d'un emplacement comme score (plus un encodage et un décodage à la volée qui sont transparents pour l'utilisateur). Geohashing, un système inventé par Gustavo Niemeyer, permet également une recherche extrêmement efficace. L'ensemble de coordonnées de localisation n'a pas besoin d'être comparé à chaque fois que la distance temporelle est calculée; la représentation garantit que les recherches peuvent être facilement limitées et ainsi devenir efficaces à la fois dans le temps et dans l'espace.

D'autres bibliothèques disponibles ajoutent des fonctionnalités intéressantes, comme l'inclusion de l'élévation dans les calculs. Par exemple, vous pouvez suivre un drone ou un groupe de drones à différentes altitudes, transportant des capteurs qui mesurent les conditions de vent ou les différences de température dans un endroit. La combinaison requise d'ensembles et d'ensembles triés est fournie dans cette API xyzsets dans la bibliothèque Geo Lua disponible sur GitHub.

Les calculs de longueur de chemin, généralement nécessaires pour naviguer entre les points de cheminement vers des destinations particulières, peuvent être facilement réalisés avec l'API geopathlen. Le suivi en temps réel est facilement mis en œuvre avec cette API de mises à jour de localisation.

Si votre application utilise des données de localisation de quelque manière que ce soit, pensez à confier une grande partie du travail acharné à Redis. Pour les très grands ensembles de données, il peut être plus rentable d'utiliser Redis sur Flash, qui utilise une combinaison de RAM et de mémoire flash pour fournir le débit extrême et les latences submillisecondes caractéristiques de Redis. Pour plus de détails techniques sur l'utilisation de Redis pour les données géospatiales, y compris la recherche Geohash et les fonctionnalités avancées avec Lua, consultez le livre blanc Redis for Geospatial Data.

Itamar Haber est l'avocat principal des développeurs de Redis Labs.

Le New Tech Forum offre un lieu pour explorer et discuter des technologies d'entreprise émergentes avec une profondeur et une ampleur sans précédent. La sélection est subjective, basée sur notre choix des technologies que nous pensons importantes et qui intéressent le plus les lecteurs. n'accepte pas les supports marketing pour la publication et se réserve le droit de modifier tout le contenu fourni. Envoyez toutes vos demandes à [email protected]