Programavimas

Kurkite geografinės erdvės programas naudodami „Redis“

Norint vis daugiau programų, būtina stebėti vietą. Socialinė programa gali sujungti vartotojus pagal vietą. Svetingumo ar kelionių programa gali naudoti vartotojo vietą norėdami nurodyti įdomias lankytinas vietas arba pateikti pasirinktinius maršrutus. Jutiklio programa gali saugoti ir analizuoti duomenis, kurie yra tiek erdvinės, tiek laiko eilutės, kad sukeltų tokį veiksmą kaip šablonų, pašalinių ir anomalijų aptikimas.

Be to, bręstant geoerdvinėms technologijoms, vietovės pagrįstos programos iš daugumos programų kartografavimo virsta sudėtingomis, pažangiausiomis programomis, kurios apdoroja ir analizuoja milijonus mobiliojo ryšio vartotojų, jutiklių tinklų, daiktų interneto įrenginių ir kitų šaltinių duomenų taškų. Pasaulis juda nuolat, o mūsų programos pradeda įsisavinti.

Vietos duomenys kelia įdomų iššūkį kūrėjui, nes pateikdami užklausą ar atlikdami padėties ir atstumo skaičiavimus, turite atsižvelgti į ilgumą (x), platumą (y) ir kartais net aukštį (z). Daugialypis vietos duomenų pobūdis reikalauja optimizuotų mechanizmų, kad juos apdorotų - traktuoti juos kaip tik sveikus skaičius yra labai neefektyvu. Jei duomenų bazėje, nesvarbu, ar tai būtų RDBMS, ar „NoSQL“ parduotuvė, trūksta galimybių tvarkyti geoerdvinius duomenis, programų programuotojai turi atlikti papildomą duomenų išankstinio apdorojimo darbą arba sukurti logiką, kurioje duomenys laikomi geoerdviniais.

Geoerdvinių duomenų apdorojimas taip pat yra realiojo laiko didelių duomenų iššūkis. Programos, naudojančios ir valdančios geoerdvinius duomenis, turi kuo trumpiausiai pateikti daug vietos užklausų („Kur tu esi?“), Atnaujinti vietą („Aš čia“) ir ieškoti duomenų pagal vietą („Kas ar kas yra netoliese? “).

Paprastas skaitymas (vietos gavimas) ir rašymas (atnaujinimo vieta) yra sudėtingas. Ieškant kitų junginių iššūkis. Esminių reikalavimų įvykdymas yra veiksmingų duomenų rodyklių palaikymas. Veiksmingas indeksas yra tas, kuris gali palengvinti greitą paiešką ir kurio išlaikymas nėra brangus (kalbant apie atmintį ir skaičiavimo galią).

Dėl „Redis“ savybių ir našumo jis puikiai tinka vietoms pritaikytoms programoms. Trūko tik vietinės geografinės padėties duomenų palaikymo. Vis dėlto, pradedant nuo 3.2 versijos, „Redis“ turi integruotą geoerdvių indeksavimą. Programų, kurios remiasi geoerdviniais duomenimis, kūrėjai dabar gali kreiptis į „Redis“, kad jie juos saugotų, apdorotų ir analizuotų - visu greičiu ir paprastumu, kurį pasiekė tikėtis iš Redio kitose programose.

Trumpa įžanga į Redį

„Redis“ yra atminties duomenų struktūros saugykla, paprastai naudojama kaip duomenų bazė, talpykla ir pranešimų tarpininkas. „Redis“ duomenų struktūros yra tarsi „Lego“ konstrukcijos elementai, padedantys kūrėjams pasiekti minimalų sudėtingumą. „Redis“ taip pat sumažina tinklo pridėtinę vertę ir vėlavimą, nes operacijos atliekamos ypač efektyviai atmintyje, šalia duomenų saugojimo vietos.

„Redis“ duomenų struktūroje yra maišos, rinkiniai, rūšiuojami rinkiniai, sąrašai, eilutės, bitų žemėlapiai ir „HyperLogLogs“. Tai yra labai optimizuota, kiekviena iš jų teikia specializuotas komandas, kurios padeda jums atlikti sudėtingas funkcijas su labai mažu kodu. Šios duomenų struktūros daro „Redis“ nepaprastai galingą ir leidžia „Redis“ pagrįstoms programoms apdoroti ekstremalias operacijų apimtis labai mažu vėlavimu.

Rūšiuoti rinkiniai yra ypač reikšmingi. Unikalus „Redis“, jie prideda tvarkytą rodinį prie narių, surūšiuotą pagal balus. Rūšiuoti rinkiniai yra nepaprastai naudingi apdorojant duomenis, tokius kaip kainos pasiūlymai, rangai, vartotojo taškai ir laiko žymos - tai leidžia analizę atlikti keliomis eilėmis greičiau, palyginti su įprastomis raktų / vertės ar „NoSQL“ parduotuvėmis.

Geografinės erdvės indeksavimas „Redis“ diegiamas naudojant rūšiuojamus rinkinius kaip pagrindinę duomenų struktūrą, bet naudojant tiesioginį kodavimą ir vietinių duomenų bei naujų API dekodavimą. Tai reiškia, kad kiekvienos vietos indeksavimą, paiešką ir rūšiavimą galima perkrauti į „Redis“ naudojant labai mažai kodo eilučių ir labai mažai pastangų, naudojant įmontuotas komandas, pvz., GEOADD, GEODAS, GEORADIUSir GEORADIUSBYMBER.

Kai sujungsite šią erdvinę paramą su kitomis „Redis“ galimybėmis, kai kurias įdomias funkcijas bus labai paprasta įgyvendinti. Pavyzdžiui, sulydžius naujus „Geo Sets“ ir „PubSub“, yra beveik nereikšminga sukurti realaus laiko stebėjimo sistemą, kurioje kiekvienas nario pozicijos atnaujinimas būtų siunčiamas visoms suinteresuotoms šalims (pagalvokite apie bėgimo ar dviračių grupę ten, kur norite) stebėti grupės narių vietas realiu laiku).

„Geo“ rinkinys

„Geo“ rinkinys yra pagrindas dirbant su geoerdviniais duomenimis „Redis“ sistemoje - tai duomenų struktūra, kuri specializuojasi valdant geoerdvinius rodiklius. Kiekvieną geografinį rinkinį sudaro vienas ar daugiau narių, kiekvieną narį sudaro unikalus identifikatorius ir ilgumos / platumos pora. Panašiai kaip ir visos „Redis“ duomenų struktūros, „Geo Sets“ yra manipuliuojami ir užduodami klausimai naudojant paprastų naudoti ir tuo pačiu metu labai optimalių komandų pogrupį.

Viduje „Geo“ rinkiniai įgyvendinami naudojant rūšiuojamą rinkinį. Rūšiuoti rinkiniai rodo gerą erdvės ir laiko pusiausvyrą, sunaudodami linijinį RAM kiekį, tuo pačiu užtikrindami logaritminį skaičiavimą daugeliui operacijų.

Kūrimas ir įtraukimas į rodyklę

Vadinama „Redis“ komanda, įtraukianti narius į geoerdvinę rodyklę GEOADD. Ši komanda naudojama kuriant naujus rinkinius ir įtraukiant narius. Šis pavyzdys, iliustruotas iš komandinės eilutės ir „Node Redis“ kliento, rodo jo naudojimą.

Redis komandos pavyzdys:

GEOADD vietos 10.9971645 45.4435245 Romeo

Mazgo Redis pavyzdys:

redis.geoadd („vietos“, „10 .9971645“, „45 .4435245“, „Romeo“);

Pirmiau Redis liepia naudoti „Geo Set“, vadinamą vietomis, nario, pavadinto „Romeo“, koordinatėms išsaugoti. Jei vietovių duomenų struktūros nėra, pirmiausia jas sukurs Redis. Naujas narys bus įtrauktas į indeksą tik tada, jei jo nėra rinkinyje.

Taip pat galima pridėti kelis narius prie indekso vienu skambučiu į GEOADD. Sudedant kelias operacijas vienoje komandoje, ši iškvietimo forma sumažina duomenų bazės ir tinklo apkrovą.

Redis komandos pavyzdys:

GEOADD vietos 10.9971645 45.4435245 Mercutio 10.9962165 45.4419226 Džuljeta

Mazgo Redis pavyzdys:

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

Indekso atnaujinimas

Užregistravus narį ir jo koordinates indekse, „Redis“ leidžia atnaujinti to nario vietą. Nariai atnaujinami geografiniame rinkinyje skambinant ta pačia komanda, kuri naudojama jiems pridėti GEOADD. Paskambinus su esamais nariais, GEOADD tiesiog atnaujina erdvinius duomenis, susietus su kiekvienu nariu, su naujomis reikšmėmis. Todėl, kai Romeo išeis iš namų, kad galėtų pradėti vakarinį pasivaikščiojimą, jo atnaujintą vietą galima užfiksuoti taip.

Redis komandos pavyzdys:

GEOADD vietos 10.999216 45.4432923 Romeo

Mazgo Redis pavyzdys:

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

Narių pašalinimas iš rodyklės

Po įtraukimo į indeksą narius gali tekti vėliau iš jo ištrinti. Kad būtų lengviau ištrinti narius iš „Geo Set“, Redis pateikia ZREM komandą. Norėdami ištrinti narį (ar narius) iš rinkinio, ZREM iškviečiamas su atitinkamu rakto pavadinimu, po kurio nariai iš jo bus ištrinti.

Redis komandos pavyzdys:

ZREM vietos Mercutio

Mazgo Redis pavyzdys:

redis.zrem (‘vietovės’, ‘Mercutio’);

Geografinę erdvinę rodyklę galima visiškai ištrinti. Kadangi indeksas saugomas kaip „Redis“ raktas, DEL komandą galima naudoti jai ištrinti.

Skaitymas iš rodyklės

„Geo Set“ indekso duomenis galima skaityti keliais būdais. Pirma, indeksas gali būti naudojamas nuskaityti visus jame esančius narius, vienoje didelėje ar keliose mažesnėse dalyse. „Redis“ pateikia dvi komandas, kurias galima naudoti kartojant visą indeksą: ZRANGE ir ZSCAN. Tačiau kadangi juos galima naudoti visiems indeksuojamiems elementams padengti, tokio tipo prieiga prie duomenų dažniausiai yra skirta neprisijungus atliekamoms nekritinėms operacijoms (pavyzdžiui, ETL ir ataskaitų teikimo procesams).

Antrasis skaitymo prieigos prie indekso tipas skirtas narių koordinatėms gauti, o tam pasiekti Redis pateikia dvi komandas. Pirmoji iš šių komandų yra GEOPOS, kuris grąžina geografinio rinkinio nario koordinates. Darant prielaidą, kad Romeo laikosi savo pasivaikščiojimo, atsakymą dėl jo dabartinės buvimo vietos pateikia atlikdamas:

Redis komandos pavyzdys:

GEOPOS vietos Romeo

1)     1) 10.999164

       2) 45.442681 

Mazgo Redis pavyzdys:

redis.geopos („vietos“, „Romeo“, funkcija (klaida, atsakymas) {

});

Aukščiau pateiktame pavyzdyje pirmoji eilutė yra užklausa, o šios eilutės yra duomenų bazės atsakymas. Redis pateikia dar vieną komandą, vadinamą GEOHASH kad praneša apie narių buvimo vietas. Nors abu praktiškai atlieka tą pačią funkciją, skirtumas tarp jų yra tas, kad GEOHASH yra užkoduotas kaip standartinis geohashas (toliau apie geohashes).

Kitas rodyklėje saugomų duomenų naudojimas yra atstumų tarp narių skaičiavimas. Bet kuriems dviem „Geo Set“ nariams GEODAS komanda apskaičiuos ir grąžins atstumą tarp jų.

Ieškoma rodyklėje

Paskutinis ir bene naudingiausias skaitymo prieigos tipas, kurį įgalina geografinė erdvinė rodyklė, yra duomenų paieška pagal jų vietą. Dažniausias tokių paieškų pavyzdys yra indeksuotų narių radimas tam tikru atstumu nuo nurodytos vietos. Tuo tikslu Redis pateikia GEORADIUS komandą.

Kaip rodo pavadinimas, GEORADIUS atlieka paiešką apskritime, kurį nurodo jo centras ir spindulys, ir grąžina narius, kurie patenka į jo vidų. Kita „Redis“ komanda, GEORADIUSBYMBER, atlieka tą patį tikslą, tačiau priima vieną iš indeksuotų narių kaip rato centrą. Toliau pateikiamas tokios paieškos pavyzdys.

Redis komandos pavyzdys:

GEORADIUSBYMBERBER vietos Romeo 100 m

1) „Džiuljeta“

Mazgo Redis pavyzdys:

redis.georadiusbymember („vietos“, „Romeo“, „100“, „m“, funkcija (klaida, atsakymas) {

});

Paieškos komanda taip pat palaiko atsakymų rūšiavimą nuo artimiausio iki toliausio (numatytasis) arba atvirkščiai, taip pat grąžina kiekvieno atsakymo vietą ir atstumą. „Redis“ taip pat leidžia saugoti atsakymą kitame rinkinyje tolesniam apdorojimui (pvz., Ieškos ir rinkinio operacijoms).

Redis už geoerdvinius duomenis

„Redis“ vietovėmis pagrįsto funkcionalumo paprastumas reiškia, kad galite ne tik lengvai valdyti geoduomenų potvynį, bet ir įdiegti intelektą be paprasto apdorojimo. Pvz., Įmontuota spindulio užklausa gali padėti įgyvendinti paprastą funkciją, pvz., „Netoliese esantys įdomūs daiktai“, neužgoždami savo vartotojo ar programos per daug pasirinkimo galimybių. Nustatytos sankirtos operacijos gali padėti izoliuoti „dominančius daiktus“ pagal kelis filtrus, pvz., Geografinę vietą, vartotojo ypatybes ir nuostatas.

Kitas efektyvumo pranašumas yra „Redis Geo“ rinkinių diegimo būdas. „Redis“ geografiniai rinkiniai yra tiesiog dar viena galingų rūšiuojamų rinkinių versija, turint esminį skirtumą, kad „Geo“ rinkiniai naudoja geohash vietovės ilgumos ir platumos kaip jos balas (be to, tiesioginis kodavimas ir dekodavimas, kuris yra skaidrus vartotojui). Gustavo Niemeyerio išrasta sistema „Geohashing“ taip pat leidžia atlikti itin efektyvią paiešką. Nereikia lyginti visos vietos koordinačių rinkinio, skaičiuojant kiekvieną laiko atstumą; pavaizdavimas užtikrina, kad paieškas galima lengvai riboti ir todėl efektyviau naudoti laiką ir erdvę.

Kitos turimos bibliotekos prideda įdomių galimybių, pavyzdžiui, į skaičiavimus įtraukia aukštį. Pavyzdžiui, galite sekti droną ar dronų grupę skirtingame aukštyje, nešdami jutiklius, matuojančius vėjo sąlygas ar temperatūros skirtumus toje vietoje. Būtinas rinkinių ir rūšiuojamų rinkinių derinys pateikiamas šiame „xyzsets“ API „Geo Lua“ bibliotekoje, esančioje „GitHub“.

Kelio ilgio skaičiavimus, paprastai reikalingus navigacijai tarp taškų į tam tikras paskirties vietas, galima lengvai atlikti naudojant geopathlen API. Realaus laiko stebėjimas yra lengvai įgyvendinamas naudojant šią vietovės naujinimų API.

Jei jūsų programa bet kokiu būdu naudoja vietovės duomenis, apsvarstykite galimybę daug sunkaus darbo perkrauti „Redis“. Labai dideliems duomenų rinkiniams gali būti ekonomiškiau naudoti „Redis on Flash“, kuris naudoja RAM ir „flash“ atminties derinį, kad užtikrintų ypatingą „Redis“ charakteristikų pralaidumą ir povandenines sekundes. Norėdami gauti daugiau techninės informacijos apie „Redis“ naudojimą geoerdviniams duomenims, įskaitant „geohash“ paiešką ir išplėstines „Lua“ galimybes, ieškokite „Redis for Geospatial Data“ dokumente.

Itamaras Haberis yra „Redis Labs“ vyriausiasis kūrėjų advokatas.

Naujųjų technologijų forumas suteikia galimybę tyrinėti ir aptarti besiformuojančios įmonės technologijas beprecedentiame gylyje. Atranka yra subjektyvi, atsižvelgiant į mūsų pasirinktas technologijas, kurios, mūsų manymu, yra svarbios ir labiausiai domina skaitytojus. nepriima rinkodaros užtikrinimo priemonės paskelbimui ir pasilieka teisę redaguoti visą pateiktą turinį. Visus klausimus siųskite adresu [email protected].

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