Programmering

Bygg geospatiale apper med Redis

For et økende antall applikasjoner er sporing av plassering viktig. En sosial applikasjon kan koble brukere basert på plassering. En gjestfrihets- eller reiseapplikasjon kan bruke brukerens beliggenhet til å peke på interessante severdigheter eller tilby tilpassede reiseruter. En sensorapplikasjon kan lagre og analysere data som er både geospatiale og tidsserier, for å utløse en handling som å oppdage mønstre, outliers og anomalier.

Når geospatial teknologi modnes, utvikler stedsbaserte applikasjoner seg fra å hovedsakelig kartlegge applikasjoner til sofistikerte, banebrytende programmer som behandler og analyserer millioner av datapunkter fra mobilbrukere, sensornettverk, IoT-enheter og andre kilder. Verden er i konstant bevegelse, og appene våre begynner å ta igjen.

Stedsdata presenterer en interessant utfordring for utvikleren fordi det å spørre dem eller utføre beregninger av posisjon og avstand må ta hensyn til lengdegrad (x), breddegrad (y) og noen ganger til og med høyde (z). Den flerdimensjonale naturen til stedsdata krever optimaliserte mekanismer for å behandle den - å behandle den som bare heltall er svært ineffektiv. Hvis databasen, enten det er en RDBMS eller en NoSQL-butikk, mangler mulighetene for håndtering av geospatiale data, må applikasjonsprogrammerere gjøre det ekstra arbeidet med å forhåndsbehandle dataene, eller de må bygge inn logikk som behandler dataene som geospatiale.

Behandling av geospatiale data er også en sanntids big data-utfordring. Applikasjoner som bruker og administrerer geospatial data må tjene, med minimal ventetid, et høyt antall forespørsler om plassering ("Hvor er du?"), Oppdateringer til plassering ("Jeg er her") og søker etter data etter sted ("Hvem eller hva er i nærheten? ”).

Enkel lesing (hent plassering) og skriv (oppdater plassering) er utfordrende i skala. Å søke på flere forbindelser utfordringen. Nøkkelen til å oppfylle kravene ovenfor er å opprettholde effektive indekser for dataene. En effektiv indeks er en som kan gjøre det raskt å søke og ikke er dyrt å vedlikeholde (når det gjelder minne og datakraft).

Egenskapene og ytelsen til Redis gjør at den passer perfekt for stedsbaserte applikasjoner. Alt som manglet var innfødt støtte for geolokaliseringsdata. Fra og med versjon 3.2 kommer Redis imidlertid med innebygd geospatial indeksering. Utviklere av applikasjoner som er avhengige av geospatiale data, kan nå se til Redis for å lagre, behandle og analysere det - med all den hastigheten og enkelheten de har kommet til forventer fra Redis i andre applikasjoner.

Kort intro til Redis

Redis er en datastrukturbutikk i minnet som ofte brukes som en database, en cache og en meldingsmegler. Datastrukturer i Redis er som Lego-byggesteiner, og hjelper utviklere å oppnå spesifikk funksjonalitet med minimal kompleksitet. Redis minimerer også nettverksomkostninger og ventetid fordi operasjoner utføres ekstremt effektivt i minnet, rett ved siden av hvor dataene er lagret.

Redis datastrukturer inkluderer Hashes, Sets, Sorted Sets, Lists, Strings, Bitmaps og HyperLogLogs. Disse er svært optimaliserte, og hver gir spesialiserte kommandoer som hjelper deg å utføre kompleks funksjonalitet med veldig lite kode. Disse datastrukturene gjør Redis ekstremt kraftig og lar Redis-baserte applikasjoner håndtere ekstreme volumer av operasjoner med svært lav ventetid.

Sorterte sett er spesielt viktige. Unikt for Redis, de legger til en ordnet visning for medlemmene, sortert etter poeng. Sorterte sett er enormt fordelaktige for behandling av data som bud, rangeringer, brukerpoeng og tidsstempler - slik at analyse kan utføres et par størrelsesordener raskere sammenlignet med ordinær nøkkel / verdi eller NoSQL-butikker.

Geospatial indeksering er implementert i Redis ved hjelp av sorterte sett som den underliggende datastrukturen, men med on-the-fly koding og dekoding av lokasjonsdata og nye APIer. Dette betyr at stedsspesifikk indeksering, søk og sortering alle kan lastes ned til Redis, med svært få kodelinjer og veldig lite arbeid, ved hjelp av innebygde kommandoer som GEOADD, GEODIST, GEORADIUS, og GEORADIUSBYMEMBER.

Når du kombinerer denne geospatiale støtten med andre Redis-muligheter, blir noen interessante funksjoner ekstremt enkle å implementere. For eksempel, ved å smelte de nye Geo Sets og PubSub, er det nesten trivielt å sette opp et sporingssystem i sanntid der hver oppdatering til et medlems stilling blir sendt til alle interesserte (tenk på en løpende eller sykling gruppe der du vil for å spore gruppemedlemmer i sanntid).

Geosettet

Geo Set er grunnlaget for å jobbe med geospatiale data i Redis - det er en datastruktur som er spesialisert for å administrere geospatiale indekser. Hvert Geo-sett består av ett eller flere medlemmer, hvor hvert medlem består av en unik identifikator og et lengdegrad / breddepar. I likhet med alle datastrukturene i Redis blir Geo Sets manipulert og spurt med et delsett av brukervennlige og samtidig svært optimale kommandoer.

Internt implementeres Geo Sets med et sortert sett. Sorterte sett viser en god balanse mellom rom og tid ved å forbruke en lineær mengde RAM mens de gir logaritmisk databehandlingskompleksitet for de fleste operasjoner.

Opprette og legge til indeksen

Redis-kommandoen for å legge til medlemmer i en geospatial indeks kalles GEOADD. Denne kommandoen brukes både for å lage nye sett og for å legge til medlemmer. Følgende eksempel, illustrert fra kommandolinjen og Node Redis-klienten, viser bruken.

Redis kommandoeksempel:

GEOADD lokasjoner 10.9971645 45.4435245 Romeo

Node Redis eksempel:

redis.geoadd (‘locations’, ‘10 .9971645 ’, ‘45 .4435245’, ‘Romeo’);

Ovennevnte forteller Redis å bruke et Geo Set kalt lokasjoner for å lagre koordinatene til medlemmet som heter Romeo. I tilfelle lokasjonsdatastrukturen ikke eksisterer, blir den først opprettet av Redis. Det nye medlemmet vil bli lagt til indeksen hvis og bare hvis det ikke finnes i settet.

Det er også mulig å legge til flere medlemmer i indeksen med en enkelt samtale til GEOADD. Ved å gruppere flere operasjoner i en enkelt kommando, reduserer denne formen for påkallelse belastningen på databasen og nettverket.

Redis kommandoeksempel:

GEOADD lokasjoner 10.9971645 45.4435245 Mercutio 10.9962165 45.4419226 Juliet

Node Redis eksempel:

redis.geoadd ('lokasjoner', '10 .9971645 ', '45 .4435245', 'Mercutio', '10 .9962165 ', '45 .4419226', 'Juliet');

Oppdaterer indeksen

Etter at et medlem og dets koordinater er registrert i indeksen, lar Redis deg oppdatere medlemmets beliggenhet. Oppdatering av medlemmer i et Geo-sett gjøres ved å ringe den samme kommandoen som ble brukt for å legge dem til, nemlig GEOADD. Når du blir ringt med eksisterende medlemmer, GEOADD bare oppdaterer de geodataene som er knyttet til hvert medlem med de nye verdiene. Derfor, når Romeo går ut av huset for å begynne kveldsturen, kan hans oppdaterte sted registreres med følgende.

Redis kommandoeksempel:

GEOADD lokasjoner 10.999216 45.4432923 Romeo

Node Redis eksempel:

redis.geoadd ('lokasjoner', '10 .999216 ', '45 .4432923', 'Romeo');

Fjerne medlemmer fra indeksen

Etter å ha blitt lagt til i indeksen, kan det hende at medlemmene må slettes fra den på et senere tidspunkt. For å gjøre det lettere å slette medlemmer fra Geo Set, tilbyr Redis ZREM kommando. For å slette et medlem (eller medlemmer) fra settet, ZREM kalles med riktig nøkkelnavn fulgt av medlemmene som skal slettes fra den.

Redis kommandoeksempel:

ZREM lokasjoner Mercutio

Node Redis eksempel:

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

Geospatialindeksen kan slettes helt. Siden indeksen er lagret som en Redis-nøkkel, blir DEL kommandoen kan brukes til å slette den.

Lesing fra indeksen

Dataene i en Geo Set-indeks kan leses på flere måter. For det første kan indeksen brukes til å skanne gjennom alle medlemmene i den, enten i en stor batch eller i flere mindre biter. Redis gir to kommandoer som kan brukes til å gjenta gjennom hele indeksen: RANGER og ZSCAN. Men fordi disse kan brukes til å dekke alle de indekserte elementene, er denne typen tilgang til dataene for det meste reservert for offline, ikke-kritiske operasjoner (for eksempel ETL og rapporteringsprosesser).

Den andre typen lesetilgang til indeksen er for å hente medlemmers koordinater, og for å oppnå at Redis gir to kommandoer. Den første av disse kommandoene er GEOPOS, som returnerer koordinatene for et gitt medlem i et Geo-sett. Forutsatt at Romeo følger med på turen, blir svaret angående hans nåværende oppholdssted gitt ved å utføre følgende.

Redis kommandoeksempel:

GEOPOS steder Romeo

1)     1) 10.999164

       2) 45.442681 

Node Redis eksempel:

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

});

I eksemplet ovenfor er den første linjen spørringen, mens de følgende linjene er databasens svar. Redis gir en annen kommando kalt GEOHASH som rapporterer hvor medlemmene befinner seg. Mens begge praktisk talt utfører den samme funksjonen, er forskjellen mellom dem at utgangen av GEOHASH er kodet som en standard geohash (mer om geohashes nedenfor).

En annen bruk for data som er lagret i indeksen er beregningsavstander mellom medlemmene. For to medlemmer i Geo Set, GEODIST kommandoen vil beregne og returnere avstanden mellom dem.

Søker i indeksen

Den siste og kanskje mest nyttige typen lesetilgang som geospatial indeks muliggjør, er å søke i dataene etter plassering. Det vanligste eksemplet på slike søk er å finne indekserte medlemmer innenfor en viss avstand fra et gitt sted. For det formålet gir Redis GEORADIUS kommando.

Som navnet antyder, GEORADIUS utfører et søk innenfor en sirkel gitt av sentrum og radius og returnerer medlemmene som faller inne i den. En annen Redis-kommando, GEORADIUSBYMEMBER, tjener samme formål, men godtar et av de indekserte medlemmene som kretsens sentrum. Følgende er et eksempel på et slikt søk.

Redis kommandoeksempel:

GEORADIUSBYMEMBER steder Romeo 100 m

1) “Juliet”

Node Redis eksempel:

redis.georadiusbymember ('lokasjoner', 'Romeo', '100', 'm', funksjon (feil, svar) {

});

Søkekommandoen støtter også sortering av svarene fra nærmeste til lengst (standard) eller omvendt, samt retur av plassering og avstand for hvert svar. Redis tillater også lagring av svaret i et annet sett for videre behandling (for eksempel personsøk og Set-operasjoner).

Redis for geospatial data

Enkelheten med å implementere stedsbasert funksjonalitet i Redis betyr at du ikke bare kan håndtere flommen av geodata enkelt, men også implementere intelligens på toppen av enkel behandling. For eksempel kan den innebygde radiuspørringen hjelpe deg med å implementere enkel funksjonalitet som "interessante ting i nærheten" uten å oversvømme brukeren eller applikasjonen din med for mange valg. Angi kryssoperasjoner kan hjelpe deg med å isolere “interessepunkter” basert på flere filtre, som geografisk plassering, brukeregenskaper og preferanser.

En annen fordel med effektivitet oppnås fra måten Redis Geo sett implementeres på. Geosett i Redis er ganske enkelt en annen versjon av de kraftige sorterte settene, med den viktigste forskjellen at Geosett bruker geohash av stedets lengdegrad og breddegrad som poengsum (pluss on-the-fly koding og dekoding som er gjennomsiktig for brukeren). Geohashing, et system oppfunnet av Gustavo Niemeyer, gjør det også mulig å søke ekstremt effektivt. Hele posisjonskoordinatsettet trenger ikke å sammenlignes hver eneste tidsavstand beregnes. representasjonen sørger for at søk lett kan begrenses og derfor blir både tid og rom effektiv.

Andre tilgjengelige biblioteker legger til interessante muligheter, som å inkludere høyde i beregninger. For eksempel kan du spore en drone eller en gruppe droner i forskjellige høyder, og bærer sensorer som måler vindforhold eller temperaturforskjeller på et sted. Den nødvendige kombinasjonen av sett og sorterte sett er gitt i dette xyzsets API i Geo Lua-biblioteket tilgjengelig på GitHub.

Beregning av banelengder, vanligvis nødvendig for å navigere mellom veipunkter til bestemte destinasjoner, kan enkelt oppnås med geopathlen API. Sanntidssporing implementeres enkelt med denne lokasjonsoppdaterings-API-et.

Hvis applikasjonen din bruker stedsdata på noen måte, bør du vurdere å laste ned mye av det harde arbeidet til Redis. For veldig store datasett kan det være mer kostnadseffektivt å bruke Redis på Flash, som bruker en kombinasjon av RAM og flashminne for å levere den ekstreme gjennomstrømningen og submillisekundens ventetid som er karakteristisk for Redis. For mer tekniske detaljer om bruk av Redis for geospatiale data, inkludert geohash-søk og avanserte muligheter med Lua, se whitepaper for Redis for Geospatial Data.

Itamar Haber er hovedutvikler for Redis Labs.

New Tech Forum er et sted for å utforske og diskutere ny teknologi i enestående dybde og bredde. Valget er subjektivt, basert på vårt valg av teknologiene vi mener er viktige og av størst interesse for leserne. godtar ikke markedsføringssikkerhet for publisering og forbeholder seg retten til å redigere alt bidratt innhold. Send alle henvendelser til [email protected].

$config[zx-auto] not found$config[zx-overlay] not found