Crea app geospaziali con Redis

Per un numero crescente di applicazioni, il rilevamento della posizione è essenziale. Un'applicazione social potrebbe connettere gli utenti in base alla posizione. Un'applicazione di ospitalità o di viaggio potrebbe utilizzare la posizione dell'utente per indicare luoghi interessanti o fornire itinerari personalizzati. Un'applicazione sensore potrebbe archiviare e analizzare dati che sono sia geospaziali che serie temporali, per attivare un'azione come il rilevamento di modelli, valori anomali e anomalie.

Inoltre, con la maturazione della tecnologia geospaziale, le applicazioni basate sulla posizione si stanno evolvendo da applicazioni principalmente di mappatura a programmi sofisticati e all'avanguardia che elaborano e analizzano milioni di punti dati da utenti mobili, reti di sensori, dispositivi IoT e altre fonti. Il mondo è in costante movimento e le nostre app stanno iniziando a prendere piede.

I dati sulla posizione rappresentano una sfida interessante per lo sviluppatore perché interrogarli o eseguire calcoli di posizione e distanza devono considerare longitudine (x), latitudine (y) e talvolta anche elevazione (z). La natura multidimensionale dei dati sulla posizione richiede meccanismi ottimizzati per elaborarli: trattarli come semplici numeri interi è altamente inefficiente. Se il database, sia che si tratti di un archivio RDBMS o NoSQL, non dispone delle capacità per la gestione dei dati geospaziali, i programmatori di applicazioni devono fare il lavoro extra di pre-elaborazione dei dati, oppure devono creare una logica che tratti i dati come geospaziali.

Anche l'elaborazione dei dati geospaziali è una sfida per i big data in tempo reale. Le applicazioni che utilizzano e gestiscono dati geospaziali devono fornire, con una latenza minima, un numero elevato di richieste di posizione ("Dove sei?"), Aggiornamenti di posizione ("Sono qui") e ricerche di dati in base alla posizione ("Chi o cosa c'è nelle vicinanze? ").

Le letture semplici (posizione di recupero) e le scritture (posizione di aggiornamento) sono impegnative su larga scala. La ricerca complica ulteriormente la sfida. La chiave per soddisfare i requisiti di cui sopra è mantenere indici efficaci per i dati. Un indice efficace è quello che può facilitare ricerche veloci e non è costoso da mantenere (in termini di memoria e potenza di calcolo).

Le caratteristiche e le prestazioni di Redis lo rendono perfetto per le applicazioni basate sulla posizione. Tutto ciò che mancava era il supporto nativo per i dati di geolocalizzazione. A partire dalla versione 3.2, tuttavia, Redis è dotato di indicizzazione geospaziale integrata. Gli sviluppatori di applicazioni che si basano su dati geospaziali possono ora rivolgersi a Redis per archiviarli, elaborarli e analizzarli, con tutta la velocità e la semplicità a cui sono giunti aspettarsi da Redis in altre applicazioni.

Breve introduzione a Redis

Redis è un archivio della struttura dei dati in memoria comunemente usato come database, cache e broker di messaggi. Le strutture dati in Redis sono come i blocchi di costruzione Lego, che aiutano gli sviluppatori a ottenere funzionalità specifiche con una complessità minima. Redis riduce inoltre al minimo il sovraccarico di rete e la latenza perché le operazioni vengono eseguite in modo estremamente efficiente in memoria, proprio accanto a dove sono archiviati i dati.

Le strutture dati di Redis includono hash, set, set ordinati, elenchi, stringhe, bitmap e HyperLogLog. Questi sono altamente ottimizzati e ciascuno fornisce comandi specializzati che consentono di eseguire funzionalità complesse con pochissimo codice. Queste strutture di dati rendono Redis estremamente potente e consentono alle applicazioni basate su Redis di gestire volumi estremi di operazioni con una latenza molto bassa.

I set ordinati sono particolarmente significativi. Esclusivi di Redis, aggiungono una visualizzazione ordinata ai membri, ordinata per punteggi. I set ordinati sono estremamente vantaggiosi per l'elaborazione di dati come offerte, classifiche, punti utente e timestamp, consentendo di eseguire l'analisi un paio di ordini di grandezza più velocemente rispetto ai normali archivi chiave / valore o NoSQL.

L'indicizzazione geospaziale viene implementata in Redis utilizzando Sorted Sets come struttura dati sottostante, ma con codifica e decodifica al volo dei dati di posizione e nuove API. Ciò significa che luogo-specifica indicizzazione, ricerca e ordinamento possono essere scaricate da Redis, con poche linee di codice e molto poco sforzo, utilizzando built-in comandi quali GEOADD, GEODIST, GEORADIUSe GEORADIUSBYMEMBER.

Quando si combina questo supporto geospaziale con altre funzionalità di Redis, alcune funzionalità interessanti diventano estremamente semplici da implementare. Ad esempio, combinando i nuovi set geografici e PubSub, è quasi banale impostare un sistema di tracciamento in tempo reale in cui ogni aggiornamento alla posizione di un membro viene inviato a tutte le parti interessate (pensa a un gruppo di corsa o di ciclismo dove vuoi per monitorare le posizioni dei membri del gruppo in tempo reale).

Il Geo Set

Il set geografico è la base per lavorare con i dati geospaziali in Redis: è una struttura di dati specializzata per la gestione degli indici geospaziali. Ogni set geografico è composto da uno o più membri, con ogni membro costituito da un identificatore univoco e una coppia longitudine / latitudine. Analogamente a tutte le strutture di dati in Redis, i set geografici vengono manipolati e interrogati utilizzando un sottoinsieme di comandi semplici da usare e allo stesso tempo altamente ottimali.

Internamente, i set geografici vengono implementati con un set ordinato. I set ordinati mostrano un buon equilibrio spazio-tempo consumando una quantità lineare di RAM fornendo al contempo complessità di elaborazione logaritmica per la maggior parte delle operazioni.

Creazione e aggiunta all'indice

Viene chiamato il comando Redis per l'aggiunta di membri a un indice geospaziale GEOADD. Questo comando viene utilizzato sia per creare nuovi set che per aggiungere membri. L'esempio seguente, illustrato dalla riga di comando e dal client Node Redis, ne dimostra l'utilizzo.

Esempio di comando Redis:

GEOADD locations 10.9971645 45.4435245 Romeo

Esempio di Node Redis:

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

Quanto sopra dice a Redis di usare un Geo Set chiamato posizioni per memorizzare le coordinate del membro chiamato Romeo. Nel caso in cui la struttura dei dati delle posizioni non esista, verrà prima creata da Redis. Il nuovo membro verrà aggiunto all'indice se e solo se non esiste nel set.

È anche possibile aggiungere più membri all'indice con una singola chiamata a GEOADD. Mettendo in batch più operazioni in un unico comando, questa forma di chiamata riduce il carico sul database e sulla rete.  

Esempio di comando Redis:

GEOADD locations 10.9971645 45.4435245 Mercutio 10.9962165 45.4419226 Juliet

Esempio di Node Redis:

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

Aggiornamento dell'indice

Dopo che un membro e le sue coordinate sono state registrate nell'indice, Redis ti consente di aggiornare la posizione di quel membro. L'aggiornamento dei membri in un set geografico viene eseguito chiamando lo stesso comando utilizzato per aggiungerli, ovvero GEOADD. Quando viene chiamato con membri esistenti, GEOADDaggiorna semplicemente i dati spaziali associati a ciascun membro con i nuovi valori. Pertanto, una volta che Romeo esce di casa per iniziare la sua passeggiata serale, la sua posizione aggiornata può essere registrata con quanto segue.

Esempio di comando Redis:

GEOADD locations 10.999216 45.4432923 Romeo

Esempio di Node Redis:

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

Rimozione di membri dall'indice

Dopo essere stati aggiunti all'indice, potrebbe essere necessario eliminarne i membri in un secondo momento. Per facilitare l'eliminazione dei membri dal set geografico, Redis fornisce il ZREMcomando. Per eliminare un membro (o membri) dal set, ZREMviene chiamato con il nome chiave appropriato seguito dai membri da eliminare da esso.

Esempio di comando Redis:

ZREM locations Mercutio

Esempio di Node Redis:

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

L'indice geospaziale può essere completamente cancellato. Poiché l'indice è archiviato come chiave Redis, è DELpossibile utilizzare il comando per eliminarlo.

Lettura dall'indice

I dati in un indice Geo Set possono essere letti in diversi modi. Innanzitutto, l'indice può essere utilizzato per eseguire la scansione di tutti i membri in esso contenuti, sia in un grande batch che in diversi blocchi più piccoli. Redis fornisce due comandi che possono essere usati per scorrere l'intero indice: ZRANGEe ZSCAN. Tuttavia, poiché questi possono essere utilizzati per coprire tutti gli elementi indicizzati, questo tipo di accesso ai dati è per lo più riservato per operazioni offline e non critiche (ad esempio, ETL e processi di reporting).

Il secondo tipo di accesso in lettura all'indice è per il recupero delle coordinate dei membri e per ottenerlo Redis fornisce due comandi. Il primo di questi comandi è GEOPOS, che restituisce le coordinate per un dato membro in un Geo Set. Supponendo che Romeo stia mantenendo la sua camminata, la risposta riguardo alla sua attuale posizione è fornita eseguendo quanto segue.

Esempio di comando Redis:

GEOPOS locations Romeo

1)     1) 10.999164

       2) 45.442681 

Esempio di Node Redis:

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

});

Nell'esempio sopra, la prima riga è la query, mentre le righe seguenti sono la risposta del database. Redis fornisce un altro comando chiamato GEOHASHche riporta le posizioni dei membri. Sebbene entrambi eseguano praticamente la stessa funzione, la differenza tra loro è che l'output di GEOHASHè codificato come un geohash standard (più su geohash di seguito).

Un altro utilizzo dei dati archiviati nell'indice è il calcolo delle distanze tra i membri. Per due membri qualsiasi nel set geografico, il GEODISTcomando calcolerà e restituirà la distanza tra loro.

Ricerca nell'indice

L'ultimo e forse il più utile tipo di accesso in lettura consentito dall'indice geospaziale è la ricerca dei dati in base alla loro posizione. L'esempio più comune di tali ricerche è trovare membri indicizzati entro una certa distanza da una data posizione. A tale scopo, Redis fornisce il GEORADIUScomando.

Come suggerisce il nome, GEORADIUSesegue una ricerca all'interno di un cerchio dato dal suo centro e dal suo raggio e restituisce i membri che cadono al suo interno. Un altro comando Redis,, ha GEORADIUSBYMEMBERlo stesso scopo ma accetta uno dei membri indicizzati come centro del cerchio. Quello che segue è un esempio di tale ricerca.

Esempio di comando Redis:

GEORADIUSBYMEMBER locations Romeo 100 m

1) “Juliet”

Esempio di Node Redis:

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

});

Il comando di ricerca supporta anche l'ordinamento delle risposte dalla più vicina alla più lontana (impostazione predefinita) o viceversa, oltre a restituire la posizione e la distanza di ciascuna risposta. Redis consente anche di memorizzare la risposta in un altro Set per ulteriori elaborazioni (come il paging e le operazioni di Set).

Redis per i dati geospaziali

La semplicità dell'implementazione della funzionalità basata sulla posizione in Redis significa che non solo puoi gestire facilmente il flusso di dati geografici, ma anche implementare l'intelligenza oltre alla semplice elaborazione. Ad esempio, la query del raggio incorporata può aiutarti a implementare funzionalità semplici come "elementi di interesse nelle vicinanze" senza sovraccaricare il tuo utente o la tua applicazione con troppe scelte. Le operazioni di impostazione degli incroci possono aiutarti a isolare gli "elementi di interesse" in base a più filtri come posizione geografica, caratteristiche dell'utente e preferenze.

Un altro vantaggio in termini di efficienza deriva dal modo in cui vengono implementati i set geografici di Redis. I set geografici in Redis sono semplicemente un'altra versione dei potenti set ordinati, con la differenza fondamentale che i set geografici utilizzano la geohashlongitudine e la latitudine di una posizione come punteggio (più codifica e decodifica al volo che è trasparente per l'utente). Geohashing, un sistema inventato da Gustavo Niemeyer, consente inoltre di effettuare ricerche in modo estremamente efficiente. L'intero set di coordinate di posizione non deve essere confrontato ogni volta che viene calcolata la distanza; la rappresentazione assicura che le ricerche possano essere limitate facilmente e quindi diventare efficienti sia in termini di tempo che di spazio.

Altre librerie disponibili aggiungono funzionalità interessanti, come l'inclusione dell'elevazione nei calcoli. Ad esempio, potresti monitorare un drone o un gruppo di droni a diverse altezze, trasportando sensori che misurano le condizioni del vento o le differenze di temperatura in un luogo. La combinazione richiesta di set e set ordinati è fornita in questa API xyzsets nella libreria Geo Lua disponibile su GitHub.

I calcoli della lunghezza del percorso, tipicamente necessari per navigare tra waypoint verso destinazioni particolari, possono essere facilmente eseguiti con l'API geopathlen. Il monitoraggio in tempo reale è facilmente implementabile con questa API per gli aggiornamenti della posizione.

Se la tua applicazione utilizza i dati sulla posizione in qualsiasi modo, valuta la possibilità di trasferire gran parte del duro lavoro su Redis. Per set di dati molto grandi, potrebbe essere più conveniente utilizzare Redis su Flash, che utilizza una combinazione di RAM e memoria flash per fornire il throughput estremo e le latenze inferiori al millisecondo caratteristiche di Redis. Per ulteriori dettagli tecnici sull'utilizzo di Redis per i dati geospaziali, inclusa la ricerca geohash e le funzionalità avanzate con Lua, consultare il white paper Redis for Geospatial Data.

Itamar Haber è il principale sostenitore degli sviluppatori di Redis Labs.

Il New Tech Forum offre un luogo per esplorare e discutere la tecnologia aziendale emergente in profondità e ampiezza senza precedenti. La selezione è soggettiva, in base alla nostra scelta delle tecnologie che riteniamo importanti e di maggiore interesse per i lettori. non accetta materiale di marketing per la pubblicazione e si riserva il diritto di modificare tutti i contenuti forniti. Invia tutte le richieste a [email protected]