Programiranje

Z Redisom ustvarite geoprostorske aplikacije

Za vedno večje število aplikacij je lokacija sledenja ključnega pomena. Socialna aplikacija lahko poveže uporabnike glede na lokacijo. Aplikacija za gostinstvo ali potovanje lahko uporabnikovo lokacijo uporabi za opozarjanje na zanimive znamenitosti ali zagotavljanje načrtov po meri. Aplikacija senzorja lahko shrani in analizira podatke, ki so tako geoprostorski kot časovni nizi, da sproži dejanje, kot je zaznavanje vzorcev, odstopanj in nepravilnosti.

Nadalje, ko geoprostorska tehnologija dozori, se aplikacije, ki temeljijo na lokaciji, razvijajo iz aplikacij za kartiranje predvsem v dovršene, vrhunske programe, ki obdelujejo in analizirajo milijone podatkovnih točk od mobilnih uporabnikov, senzorskih omrežij, naprav IoT in drugih virov. Svet je v nenehnem gibanju in naše aplikacije se začnejo loviti.

Podatki o lokaciji predstavljajo razvijalcu zanimiv izziv, ker je treba pri poizvedovanju ali izračunu položaja in razdalje upoštevati zemljepisno dolžino (x), zemljepisno širino (y) in včasih celo nadmorsko višino (z). Večdimenzionalna narava podatkov o lokaciji zahteva optimizirane mehanizme za njihovo obdelavo - obravnavanje le kot celih števil je zelo neučinkovito. Če baza podatkov, bodisi RDBMS ali NoSQL, nima zmožnosti za obdelavo geoprostorskih podatkov, morajo programerji programov dodatno opraviti predhodno obdelavo podatkov ali pa morajo vgraditi logiko, ki podatke obravnava kot geoprostorske.

Obdelava geoprostorskih podatkov je tudi izziv velikih podatkov v realnem času. Aplikacije, ki uporabljajo in upravljajo geoprostorske podatke, morajo z minimalno zakasnitvijo postreči z velikim številom zahtev za lokacijo (»Kje si?«), Posodobitvami lokacije (»Tukaj sem«) in iskati podatke po lokaciji (»Kdo ali kaj je v bližini? ").

Preprosta branja (lokacija pridobivanja) in pisanja (lokacija posodobitve) sta zahtevna. Iskanje nadalje sestavlja izziv. Ključ do izpolnjevanja zgornjih zahtev je vzdrževanje učinkovitih indeksov za podatke. Učinkovit indeks je tisti, ki lahko olajša hitro iskanje in ga ni drago vzdrževati (glede pomnilnika in računske moči).

Zaradi značilnosti in zmogljivosti Redisa je primeren za lokacijske aplikacije. Manjkala je le izvorna podpora za podatke o geolokaciji. Od različice 3.2 pa ima Redis vgrajeno geoprostorsko indeksiranje. Razvijalci aplikacij, ki se zanašajo na geoprostorske podatke, lahko zdaj Redis poiščejo, da jih shrani, obdela in analizira - z vso hitrostjo in preprostostjo, do katere so prišli pričakujte od Redisa v drugih aplikacijah.

Kratek uvod v Redis

Redis je shramba podatkov v pomnilniku, ki se običajno uporablja kot baza podatkov, predpomnilnik in posrednik sporočil. Podatkovne strukture v Redisu so kot gradniki Lego, ki razvijalcem pomagajo doseči posebne funkcije z minimalno zapletenostjo. Redis prav tako zmanjšuje obremenitve omrežja in zakasnitve, ker se operacije izvajajo zelo učinkovito v pomnilniku, tik ob kraju shranjevanja podatkov.

Podatkovne strukture Redis vključujejo haše, nabore, razvrščene nabore, sezname, nize, bitne slike in HyperLogLogs. Ti so zelo optimizirani, vsak ponuja posebne ukaze, ki vam pomagajo izvajati zapletene funkcije z zelo malo kode. Zaradi teh podatkovnih struktur je Redis izjemno zmogljiv in omogoča, da aplikacije, ki temeljijo na Redisu, obdelujejo izjemne količine operacij pri zelo majhni zakasnitvi.

Razvrščeni kompleti so še posebej pomembni. Edisovo za Redis, članom dodajo urejen pogled, razvrščen po ocenah. Razvrščeni nabori so izjemno ugodni za obdelavo podatkov, kot so ponudbe, uvrstitve, uporabniške točke in časovni žigi - kar omogoča, da se analiza izvede nekaj zaporedjev hitreje v primerjavi z običajnimi shrambami ključ / vrednost ali NoSQL.

Geoprostorsko indeksiranje se izvaja v Redisu z uporabo razvrščenih nizov kot osnovne podatkovne strukture, vendar z neposrednim kodiranjem in dekodiranjem podatkov o lokaciji ter novimi API-ji. To pomeni, da je mogoče indeksiranje, iskanje in razvrščanje, specifično za lokacijo, z zelo malo vrstic kode in zelo malo truda razložiti v Redis z uporabo vgrajenih ukazov, kot so GEOADD, GEODIST, GEORADIJ, in GEORADIUSBYMEMBER.

Ko združite to geoprostorsko podporo z drugimi Redisovimi zmožnostmi, postane zanimiva funkcionalnost izjemno enostavna za uporabo. Na primer, z združevanjem novih Geo Sets in PubSub je skoraj nepomembno vzpostaviti sistem za sledenje v realnem času, v katerem se vsaka posodobitev položaja člana pošlje vsem zainteresiranim (pomislite na tekaško ali kolesarsko skupino, kjer želite za sledenje lokacijam članov skupine v realnem času).

Geo Set

Geo Set je osnova za delo z geoprostorskimi podatki v Redisu - to je podatkovna struktura, ki je specializirana za upravljanje geoprostorskih indeksov. Vsak Geo Set je sestavljen iz enega ali več članov, pri čemer je vsak član sestavljen iz edinstvenega identifikatorja in para zemljepisne dolžine / širine. Podobno kot pri vseh podatkovnih strukturah v Redisu tudi z Geo Sets upravljamo in poizvedujemo z uporabo podskupine enostavnih in hkrati zelo optimalnih ukazov.

Interno se Geo Sets izvajajo z razvrščenim nizom. Razvrščeni kompleti kažejo dobro prostorsko-časovno ravnovesje z zajemanjem linearne količine RAM-a, hkrati pa zagotavljajo logaritemsko računsko zapletenost za večino operacij.

Ustvarjanje in dodajanje v indeks

Kliče se ukaz Redis za dodajanje članov v geoprostorski indeks GEOADD. Ta ukaz se uporablja tako za ustvarjanje novih nizov kot za dodajanje članov. Naslednji primer, prikazan iz ukazne vrstice in odjemalca Node Redis, prikazuje njegovo uporabo.

Primer ukaza Redis:

Lokacije GEOADD 10.9971645 45.4435245 Romeo

Primer vozlišča Redis:

redis.geoadd ("lokacije", "10 .9971645", "45 .4435245 "," Romeo ");

Zgoraj Redisu pove, naj za shranjevanje koordinat člana z imenom Romeo uporabi Geo Set, imenovan lokacije. Če struktura podatkov o lokacijah ne obstaja, jo bo najprej ustvaril Redis. Novi član bo indeksu dodan le in samo, če v naboru ne obstaja.

V indeks je mogoče z enim klicem dodati tudi več članov GEOADD. Z združevanjem več operacij v enem ukazu ta oblika klica zmanjša obremenitev baze podatkov in omrežja.

Primer ukaza Redis:

Lokacije GEOADD 10.9971645 45.4435245 Mercutio 10.9962165 45.4419226 Juliet

Primer vozlišča Redis:

redis.geoadd („lokacije“, „10 .9971645“, „45 .4435245“, „Mercutio“, „10 .9962165“, „45 .4419226“, „Julija“);

Posodabljanje indeksa

Ko so član in njegove koordinate zabeleženi v indeksu, vam Redis omogoča posodobitev lokacije tega člana. Posodabljanje članov v Geo Set poteka tako, da pokličete isti ukaz, ki se uporablja za njihovo dodajanje, in sicer GEOADD. Ko se pokliče z obstoječimi člani, GEOADD preprosto posodobi prostorske podatke, povezane z vsakim članom, z novimi vrednostmi. Ko Romeo izstopi iz hiše, da začne večerno sprehajanje, lahko njegovo posodobljeno lokacijo zabeleži z naslednjim.

Primer ukaza Redis:

Lokacije GEOADD 10.999216 45.4432923 Romeo

Primer vozlišča Redis:

redis.geoadd („lokacije“, „10 .999216“, „45 .4432923“, „Romeo“);

Odstranjevanje članov iz indeksa

Potem ko so bili člani dodani v indeks, ga bo morda treba pozneje izbrisati. Za lažje brisanje članov iz Geo Set Redis zagotavlja ZREM ukaz. Če želite člana (ali člane) izbrisati iz niza, ZREM se pokliče z ustreznim imenom ključa, ki mu sledijo člani, ki jih želite izbrisati iz njega.

Primer ukaza Redis:

ZREM lokacije Mercutio

Primer vozlišča Redis:

redis.zrem ("lokacije", "Mercutio");

Geoprostorski indeks se lahko v celoti izbriše. Ker je indeks shranjen kot tipka Redis, je DEL ukaz lahko uporabite za njegovo brisanje.

Branje iz indeksa

Podatke v indeksu Geo Set lahko beremo na več načinov. Najprej lahko indeks uporabimo za skeniranje vseh članov v njem, bodisi v eni veliki seriji ali v več manjših kosih. Redis ponuja dva ukaza, ki ju je mogoče uporabiti za iteracijo skozi celoten indeks: ZRANGE in ZSCAN. Ker pa jih je mogoče uporabiti za pokrivanje vseh indeksiranih elementov, je ta vrsta dostopa do podatkov večinoma rezervirana za nekritične operacije brez povezave (na primer ETL in procesi poročanja).

Druga vrsta bralnega dostopa do indeksa je pridobivanje koordinat članov in doseganje tega, da Redis ponuja dva ukaza. Prvi od teh ukazov je GEOPOS, ki vrne koordinate za danega člana v Geo Set. Ob predpostavki, da Romeo drži svojo hojo, je odgovor glede njegovega trenutnega prebivališča zagotovljen z naslednjim.

Primer ukaza Redis:

GEOPOS lokacije Romeo

1)     1) 10.999164

       2) 45.442681 

Primer vozlišča Redis:

redis.geopos ("lokacije", "Romeo", funkcija (napaka, odgovor) {

});

V zgornjem primeru je prva vrstica poizvedba, medtem ko so naslednje vrstice odgovor baze podatkov. Redis ponuja še en klic GEOHASH ki poroča o lokacijah članov. Medtem ko oba praktično opravljata enako funkcijo, je razlika med njima v tem, da je rezultat GEOHASH je kodiran kot standardni geohash (več o geohashih spodaj).

Druga uporaba podatkov, ki so shranjeni v indeksu, je izračunavanje razdalj med člani. Za katera koli dva člana v Geo Set, GEODIST ukaz izračuna in vrne razdaljo med njima.

Iskanje po indeksu

Zadnja in morda najbolj uporabna vrsta bralnega dostopa, ki jo omogoča geoprostorski indeks, je iskanje podatkov po njihovi lokaciji. Najpogostejši primer takšnih iskanj je iskanje indeksiranih članov na določeni razdalji od določene lokacije. V ta namen Redis zagotavlja GEORADIJ ukaz.

Kot že ime pove, GEORADIJ izvede iskanje znotraj kroga, ki ga določa središče in polmer, in vrne člane, ki spadajo v notranjost. Še en ukaz Redisa, GEORADIUSBYMEMBER, služi istemu namenu, vendar sprejme enega od indeksiranih članov kot središče kroga. Sledi primer takšnega iskanja.

Primer ukaza Redis:

GEORADIUSBYMEMBER lokacije Romeo 100 m

1) "Julija"

Primer vozlišča Redis:

redis.georadiusbymember ("lokacije", "Romeo", "100", "m", funkcija (napaka, odgovor) {

});

Ukaz za iskanje podpira tudi razvrščanje odgovorov od najbližjega do najbolj oddaljenega (privzeto) ali obratno, kot tudi vrnitev lokacije in oddaljenosti vsakega odgovora. Redis omogoča tudi shranjevanje odgovora v drugem nizu za nadaljnjo obdelavo (na primer iskanje strani in operacije niza).

Redis za geoprostorske podatke

Enostavnost izvajanja lokacijske funkcije v Redisu pomeni, da ne morete le enostavno obvladati poplave geodatov, temveč tudi preprosto inteligenco poleg preproste obdelave. Na primer, vgrajena poizvedba s polmerom vam lahko pomaga pri izvajanju preprostih funkcij, kot so »zanimivi predmeti v bližini«, ne da bi uporabnika ali aplikacijo zasenčili s preveč možnosti. Z nastavitvijo križišč lahko na podlagi več filtrov, kot so geografski položaj, značilnosti uporabnika in nastavitve, izolirate »predmete, ki vas zanimajo«.

Še ena prednost v učinkovitosti je posledica načina izvajanja naborov Redis Geo. Geo Sets v Redisu so preprosto druga različica zmogljivih razvrščenih naborov, s ključno razliko, da Geo Sets uporabljajo geohash zemljepisne dolžine in širine lokacije kot njen rezultat (plus medletno kodiranje in dekodiranje, ki je uporabniku pregledno). Geohashing, sistem, ki ga je izumil Gustavo Niemeyer, omogoča tudi izjemno učinkovito iskanje. Celotnega nabora koordinat lokacije ni treba primerjati z vsako izračunano časovno razdaljo; predstavitev zagotavlja, da je iskanje mogoče enostavno omejiti in tako postati časovno in prostorsko učinkovito.

Druge knjižnice, ki so na voljo, dodajo zanimive zmožnosti, na primer vključitev višine v izračune. Na primer, morda sledite brezpilotnemu zrakoplovu ali skupini brezpilotnih letal na različnih višinah in nosite senzorje, ki merijo razmere vetra ali temperaturne razlike na lokaciji. Zahtevana kombinacija naborov in razvrščenih naborov je na voljo v tem API-ju xyzsets v knjižnici Geo Lua, ki je na voljo na GitHub.

Izračune dolžine poti, ki so običajno potrebni za krmarjenje med točkami do določenih ciljev, je mogoče enostavno izvesti z API-jem geopathlen. Sledenje v realnem času je enostavno implementirati s tem API-jem za posodobitev lokacije.

Če vaša aplikacija na kakršen koli način uporablja podatke o lokaciji, razmislite o tem, da bi veliko težkega dela razložili v Redis. Za zelo velike nabore podatkov je morda stroškovno učinkovitejša uporaba Redisa na Flash, ki s kombinacijo RAM-a in bliskovnega pomnilnika zagotavlja izjemno prepustnost in submilisekundne zakasnitve, značilne za Redis. Za več tehničnih podrobnosti o uporabi Redisa za geoprostorske podatke, vključno z iskanjem geohash-a in naprednimi funkcijami z Lua, glejte beli dokument Redis za geoprostorske podatke.

Itamar Haber je glavni zagovornik razvijalcev za Redis Labs.

Forum New Tech ponuja prizorišče za raziskovanje in razpravo o nastajajoči podjetniški tehnologiji v globini in širini brez primere. Izbor je subjektiven in temelji na našem izboru tehnologij, za katere menimo, da so pomembne in najbolj zanimajo bralce. ne sprejema tržnih zavarovanj za objavo in si pridržuje pravico do urejanja celotne prispevane vsebine. Vsa vprašanja pošljite na [email protected].

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