Ohjelmointi

Rakenna paikkatietosovelluksia Redisin avulla

Yhä useammalle sovellukselle sijainnin seuranta on välttämätöntä. Sosiaalinen sovellus saattaa yhdistää käyttäjiä sijainnin perusteella. Vieraanvaraisuus- tai matkasovellus voi käyttää käyttäjän sijaintia osoittamaan mielenkiintoisia nähtävyyksiä tai tarjoamaan mukautettuja reittejä. Anturisovellus voi tallentaa ja analysoida sekä paikkatietoa että aikasarjoja sisältävän datan käynnistääkseen toiminnan, kuten kuvioiden, poikkeamien ja poikkeavuuksien havaitsemisen.

Lisäksi paikkatekniikan kypsyessä sijaintiin perustuvat sovellukset kehittyvät lähinnä kartoitussovelluksista kehittyneiksi, huippuluokan ohjelmiksi, jotka käsittelevät ja analysoivat miljoonia datapisteitä mobiilikäyttäjiltä, ​​anturiverkkoista, IoT-laitteista ja muista lähteistä. Maailma on jatkuvassa liikkeessä, ja sovelluksemme alkavat tarttua.

Sijaintitiedot ovat mielenkiintoinen haaste kehittäjälle, koska niiden kyselyssä tai sijainnin ja etäisyyden laskemisessa on otettava huomioon pituusaste (x), leveysaste (y) ja joskus jopa korkeus (z). Sijaintitietojen moniulotteisuus edellyttää optimoituja mekanismeja sen käsittelemiseksi - sen käsitteleminen vain kokonaislukuina on erittäin tehotonta. Jos tietokannasta, olipa kyseessä RDBMS tai NoSQL-varasto, puuttuu paikkatietojen käsittelymahdollisuudet, sovellusohjelmoijien on tehtävä ylimääräinen työ tietojen esikäsittelyä varten tai heidän on rakennettava logiikka, joka käsittelee tietoja paikkatietona.

Paikkatietojen käsittely on myös reaaliaikainen, big data -haaste. Paikkatietoja käyttävien ja hallinnoivien sovellusten on palveltava mahdollisimman pienellä viiveellä suuri määrä sijaintipyyntöjä ("Missä olet?"), Päivityksiä sijaintiin ("Olen täällä") ja etsivät tietoja sijainnin mukaan ("Kuka tai mikä on lähellä? ”).

Yksinkertaiset lukutavat (noutopaikka) ja kirjoitukset (päivityssijainti) ovat haastavia mittakaavassa. Haettaessa muita yhdisteitä haasteen. Avain yllä olevien vaatimusten täyttämiseen on tehokkaiden hakemistojen ylläpito. Tehokas hakemisto voi helpottaa nopeita hakuja, eikä sen ylläpito ole kallista (muistin ja laskentatehon kannalta).

Rediksen ominaisuudet ja suorituskyky tekevät siitä erinomaisen sijaintipohjaisiin sovelluksiin. Puuttui vain natiivi tuki maantieteelliselle sijainnille. Versiosta 3.2 lähtien Rediksen mukana on kuitenkin sisäänrakennettu paikkatietojen indeksointi. Paikkatietoihin perustuvien sovellusten kehittäjät voivat nyt etsiä Rediltä tallentamaan, käsittelemään ja analysoimaan sitä kaikella nopeudella ja yksinkertaisuudella, johon he ovat tulleet. odottaa Rediseltä muissa sovelluksissa.

Lyhyt esittely Rediselle

Redis on muistin sisäinen tietorakennevarasto, jota käytetään yleisesti tietokantana, välimuistina ja viestien välittäjänä. Rediksen tietorakenteet ovat kuin Lego-rakennuspalikoita, jotka auttavat kehittäjiä saavuttamaan tietyt toiminnot minimaalisella monimutkaisuudella. Redis myös minimoi verkon yleiskustannukset ja viiveen, koska toiminnot suoritetaan erittäin tehokkaasti muistissa aivan tietojen tallennuspaikan vieressä.

Redis-tietorakenteet sisältävät hajautukset, sarjat, lajitellut joukot, luettelot, merkkijonot, bittikartat ja HyperLogLogs. Nämä ovat erittäin optimoituja, ja kukin tarjoaa erikoistuneita komentoja, jotka auttavat sinua suorittamaan monimutkaiset toiminnot hyvin pienellä koodilla. Nämä tietorakenteet tekevät Redisistä erittäin tehokkaan ja antavat Redis-pohjaisten sovellusten käsitellä äärimmäisiä toimintamääriä hyvin pienellä viiveellä.

Lajitellut sarjat ovat erityisen merkittäviä. Ainutlaatuinen Redikselle he lisäävät jäsenille järjestetyn näkymän, lajiteltu pisteiden mukaan. Lajiteltuja sarjoja on erittäin edullista käsitellä tietoja, kuten tarjouksia, rivejä, käyttäjäpisteitä ja aikaleimoja - jolloin analyysi voidaan suorittaa pari kertaluokkaa nopeammin verrattuna tavallisiin avain- / arvo- tai NoSQL-myymälöihin.

Paikkatieteellinen indeksointi toteutetaan Redisissä käyttämällä lajiteltuja sarjoja taustalla olevana tietorakenteena, mutta paikannustietojen ja uusien sovellusliittymien koodauksella ja dekoodauksella lennossa. Tämä tarkoittaa sitä, että sijaintikohtainen indeksointi, haku ja lajittelu voidaan kaikki purkaa Redis-palveluun hyvin harvoilla koodiriveillä ja hyvin vähän vaivaa käyttämällä sisäänrakennettuja komentoja, kuten GEOADD, GEODISTI, GEORADIUSja GEORADIUSBYMember.

Kun yhdistät tämän paikkatieteellisen tuen muihin Redis-ominaisuuksiin, jotkut mielenkiintoiset toiminnot ovat erittäin yksinkertaisia ​​toteuttaa. Esimerkiksi sulauttamalla uudet Geo-setit ja PubSub on melkein triviaalia perustaa reaaliaikainen seurantajärjestelmä, jossa jokainen jäsenen aseman päivitys lähetetään kaikille kiinnostuneille (ajattele juoksevaa tai pyöräilevää ryhmää missä haluat) seurata ryhmän jäsenten sijainteja reaaliajassa).

Geo-sarja

Geosarja on perusta työskennellessä paikkatietojen kanssa Redisissä - se on tietorakenne, joka on erikoistunut paikkatieteellisten indeksien hallintaan. Kukin geosarja koostuu yhdestä tai useammasta jäsenestä, joista jokainen koostuu yksilöllisestä tunnisteesta ja pituus / leveyspiiristä. Samoin kuin kaikki Rediksen tietorakenteet, Geo-sarjoja manipuloidaan ja kysytään käyttämällä yksinkertaisesti käytettävien ja samalla erittäin optimaalisten komentojen osajoukkoa.

Sisäisesti Geo-sarjat toteutetaan lajitelluilla sarjoilla. Lajiteltuilla sarjoilla on hyvä aika-aika-tasapaino kuluttamalla lineaarinen määrä RAM-muistia samalla kun logaritminen laskenta on monimutkaista useimmille toiminnoille.

Hakemiston luominen ja lisääminen siihen

Redis-komentoa jäsenten lisäämiseksi paikkatietohakemistoon kutsutaan GEOADD. Tätä komentoa käytetään sekä uusien ryhmien luomiseen että jäsenten lisäämiseen. Seuraava esimerkki, joka on kuvattu komentoriviltä ja Node Redis -asiakasohjelmasta, osoittaa sen käytön.

Redis-komentoesimerkki:

GEOADD-sijainnit 10.9971645 45.4435245 Romeo

Solmu Redis -esimerkki:

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

Edellä käsketään Redistä käyttämään Geo-ryhmää, jota kutsutaan paikoiksi Romeo-nimisen jäsenen koordinaattien tallentamiseen. Jos sijaintitietorakennetta ei ole, Redis luo sen ensin. Uusi jäsen lisätään hakemistoon vain ja vain, jos sitä ei ole joukossa.

On myös mahdollista lisätä useita jäseniä hakemistoon yhdellä puhelulla GEOADD. Panostamalla useita toimintoja yhdellä komennolla tämä kutsumuoto vähentää tietokannan ja verkon kuormitusta.

Redis-komentoesimerkki:

GEOADD-sijainnit 10.9971645 45.4435245 Mercutio 10.9962165 45.4419226 Julia

Solmu Redis -esimerkki:

redis.geoadd (’sijainnit’, ’10 .9971645 ’, ’45 .4435245’, ’Mercutio’, ’10 .9962165 ’, ’45 .4419226’, ’Juliet’);

Hakemiston päivittäminen

Kun jäsen ja sen koordinaatit on tallennettu hakemistoon, Redis antaa sinun päivittää jäsenen sijainnin. Geo-ryhmän jäsenten päivittäminen tapahtuu kutsumalla samaa komentoa, jota käytetään niiden lisäämiseen, nimittäin GEOADD. Kun soitetaan nykyisten jäsenten kanssa, GEOADD yksinkertaisesti päivittää paikkatiedot, jotka on liitetty jokaiseen jäseneen uusilla arvoilla. Siksi, kun Romeo poistuu talosta aloittaakseen iltakävelyn, hänen päivitetyn sijaintinsa voidaan tallentaa seuraavalla tavalla.

Redis-komentoesimerkki:

GEOADD-sijainnit 10.999216 45.4432923 Romeo

Solmu Redis -esimerkki:

redis.geoadd (’sijainnit’, ’10 .999216 ’, ’45 .4432923’, ’Romeo’);

Jäsenten poistaminen hakemistosta

Kun jäsenet on lisätty hakemistoon, ne voidaan joutua poistamaan siitä myöhemmin. Jäsenten poistamisen helpottamiseksi Geo-sarjasta Redis tarjoaa ZREM komento. Jos haluat poistaa jäsenen (tai jäsenet) joukosta, ZREM kutsutaan asianmukaisella avainnimellä, jota seuraavat jäsenet poistetaan siitä.

Redis-komentoesimerkki:

ZREM-sijainnit Mercutio

Solmu Redis -esimerkki:

redis.zrem (’sijainnit’, ’Mercutio’);

Paikkatieteellinen hakemisto voidaan poistaa kokonaan. Koska hakemisto on tallennettu Redis-avaimeksi, DEL komentoa voidaan käyttää sen poistamiseen.

Luetaan hakemistosta

Geo Set -hakemiston tiedot voidaan lukea monin tavoin. Ensinnäkin, hakemistoa voidaan käyttää kaikkien sen jäsenten skannaamiseen joko yhdessä suuressa erässä tai useissa pienemmissä paloissa. Redis tarjoaa kaksi komentoa, joita voidaan käyttää koko indeksin iterointiin: ALUE ja ZSCAN. Koska näitä voidaan kuitenkin käyttää kaikkien indeksoitujen elementtien kattamiseen, tämän tyyppinen pääsy tietoihin on varattu enimmäkseen offline-kriittisille operaatioille (esimerkiksi ETL ja raportointiprosessit).

Toinen hakemiston lukuoikeus on jäsenten koordinaattien hakemiseen, ja Redis tarjoaa kaksi komentoa. Ensimmäinen näistä komennoista on GEOPOS, joka palauttaa koordinaatit tietylle jäsenelle maantieteellisessä joukossa. Olettaen, että Romeo pitää vaelluksensa, vastaus hänen nykyiseen olinpaikkaansa annetaan suorittamalla seuraava.

Redis-komentoesimerkki:

GEOPOS-sijainnit Romeo

1)     1) 10.999164

       2) 45.442681 

Solmu Redis -esimerkki:

redis.geopos (’sijainnit’, ’Romeo’, toiminto (virhe, vastaus) {

});

Yllä olevassa esimerkissä ensimmäinen rivi on kysely, kun taas seuraavat rivit ovat tietokannan vastaus. Redis tarjoaa toisen komennon nimeltä GEOHASH joka ilmoittaa jäsenten sijainnit. Vaikka molemmat suorittavat käytännössä saman toiminnon, ero niiden välillä on se, että GEOHASH on koodattu tavalliseksi geohashiksi (lisätietoja geohasheista alla).

Toinen hakemistoon tallennettujen tietojen käyttö on jäsenten välisten etäisyyksien laskeminen. Kaikkien kahden Geo-sarjan jäsenen kohdalla GEODISTI komento laskee ja palauttaa niiden välisen etäisyyden.

Hakeminen hakemistosta

Viimeinen ja kenties hyödyllisin lukuoikeus, jonka paikkatietohakemisto mahdollistaa, on tietojen haku sijainnin perusteella. Yleisin esimerkki tällaisista hauista on indeksoitujen jäsenten löytäminen tietylle etäisyydelle tietystä sijainnista. Tätä tarkoitusta varten Redis toimittaa GEORADIUS komento.

Kuten nimestä voi päätellä, GEORADIUS suorittaa haun keskuksen ja säteen antamalla ympyrällä ja palauttaa sen sisällä olevat jäsenet. Toinen Redis-komento, GEORADIUSBYMember, palvelee samaa tarkoitusta, mutta hyväksyy yhden indeksoiduista jäsenistä ympyrän keskipisteeksi. Seuraava on esimerkki tällaisesta hausta.

Redis-komentoesimerkki:

GEORADIUSBYMEMBER paikkoja Romeo 100 m

1) "Julia"

Solmu Redis -esimerkki:

redis.georadiusbymember (’sijainnit’, ‘Romeo’, ’100’, ’m’, toiminto (virhe, vastaus) {

});

Hakukomento tukee myös vastausten lajittelua lähimmästä kauimpaan (oletus) tai päinvastoin sekä palauttamalla kunkin vastauksen sijainnin ja etäisyyden. Redis sallii vastauksen tallentamisen toiseen sarjaan jatkokäsittelyä varten (kuten henkilöhaku ja asetustoiminnot).

Tee uudelleen paikkatiedot

Sijaintiin perustuvien toimintojen yksinkertainen käyttöönotto Redis-sovelluksessa tarkoittaa, että voit paitsi hallita geodatatulvaa helposti myös toteuttaa älykkyyttä yksinkertaisen käsittelyn lisäksi. Esimerkiksi sisäänrakennettu sädekysely voi auttaa sinua toteuttamaan yksinkertaisia ​​toimintoja, kuten "lähellä olevat kiinnostavat kohteet", tuhoamatta käyttäjää tai sovellusta liian monilla valinnoilla. Määritetyt risteysoperaatiot voivat auttaa sinua eristämään kiinnostavat kohteet useiden suodattimien, kuten maantieteellisen sijainnin, käyttäjän ominaisuuksien ja mieltymysten, perusteella.

Toinen hyöty tehokkuudesta on Redis Geo -sarjojen toteuttamistavoista. Redisissä olevat geosarjat ovat yksinkertaisesti toinen versio tehokkaista lajitelluista sarjoista, sillä tärkein ero on, että geopaketit käyttävät geohash sijainnin pituus- ja leveysaste sen pisteinä (plus käyttäjälle avoin lennon koodaus ja dekoodaus). Gustavo Niemeyerin keksimä järjestelmä Geohashing mahdollistaa myös erittäin tehokkaan haun. Koko sijaintikoordinaatistoa ei tarvitse verrata jokaista aikamatkaa laskettaessa; esitys varmistaa, että hakuja voidaan rajoittaa helposti ja että niistä tulee siten sekä aikaa että tilaa säästäviä.

Muut käytettävissä olevat kirjastot lisäävät mielenkiintoisia ominaisuuksia, kuten korkeuden sisällyttäminen laskelmiin. Voit esimerkiksi seurata dronea tai droniryhmää eri korkeuksissa ja kantaa antureita, jotka mittaavat tuulen olosuhteita tai lämpötilaeroja sijainnissa. Vaadittu yhdistelmien ja lajiteltujen ryhmien yhdistelmä on tässä xyzsets-sovellusliittymässä Geo Lua -kirjastossa, joka on saatavana GitHubissa.

Reittipituuden laskelmat, joita tyypillisesti tarvitaan navigointiin reittipisteiden välillä tiettyihin kohteisiin, voidaan helposti suorittaa geopathlen-sovellusliittymällä. Reaaliaikainen seuranta on helppo toteuttaa tällä sijaintipäivitysten sovellusliittymällä.

Jos sovelluksesi käyttää sijaintitietoja millään tavalla, harkitse paljon kovan työn lataamista Redikselle. Hyvin suurille tietojoukoille saattaa olla kustannustehokkaampaa käyttää Redistä Flashissä, joka käyttää RAM-muistin ja flash-muistin yhdistelmää tuottamaan Redikselle ominaiset äärimmäiset läpisyöttö- ja submillisekunnin viiveet. Lisätietoja Rediksen käytöstä paikkatietoihin, mukaan lukien geohash-haku ja edistyneet ominaisuudet Luan kanssa, on Redis for Geospatial Data -asiakirjassa.

Itamar Haber on Redis Labsin pääkehittäjä.

New Tech Forum tarjoaa mahdollisuuden tutkia ja keskustella kehittyvistä yritysteknologioista ennennäkemättömällä syvyydellä ja laajuudella. Valinta on subjektiivinen, perustuu valitsemiemme tekniikoihin, joiden uskomme olevan tärkeitä ja kiinnostavia lukijoille. ei hyväksy markkinointivakuuksia julkaisua varten ja pidättää oikeuden muokata kaikkea lähetettyä sisältöä. Lähetä kaikki tiedustelut osoitteeseen [email protected].

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