Programovanie

Vytváranie geopriestorových aplikácií s Redis

Pre čoraz väčší počet aplikácií je sledovanie polohy nevyhnutné. Sociálna aplikácia môže spájať používateľov na základe polohy. Aplikácia na pohostenie alebo cestovanie môže pomocou polohy používateľa poukázať na zaujímavé pamiatky alebo poskytnúť vlastný cestovný plán. Aplikácia senzora môže ukladať a analyzovať údaje, ktoré sú geopriestorové aj časové, na spustenie akcie, ako je zisťovanie vzorov, odľahlých hodnôt a anomálií.

Postupom času, keď geopriestorová technológia dozrieva, sa aplikácie založené na umiestnení vyvíjajú hlavne z mapovacích aplikácií do sofistikovaných špičkových programov, ktoré spracúvajú a analyzujú milióny dátových bodov od mobilných používateľov, sietí senzorov, zariadení IoT a ďalších zdrojov. Svet je v neustálom pohybe a naše aplikácie sa začínajú chytať.

Údaje o polohe predstavujú pre vývojára zaujímavú výzvu, pretože pri ich dopytovaní alebo výpočtoch polohy a vzdialenosti je potrebné brať do úvahy zemepisnú dĺžku (x), zemepisnú šírku (y) a niekedy dokonca nadmorskú výšku (z). Multidimenzionálna povaha údajov o polohe vyžaduje optimalizované mechanizmy na ich spracovanie - považovať ich iba za celé čísla je vysoko neúčinné. Ak v databáze, či už úložisku RDBMS alebo NoSQL, chýbajú možnosti spracovania geopriestorových údajov, musia aplikační programátori vykonať ďalšiu prácu s predspracovaním údajov, alebo musia zabudovať logiku, ktorá s údajmi zaobchádza ako s geopriestorovými.

Spracovanie geopriestorových údajov je tiež výzvou pre veľké dáta v reálnom čase. Aplikácie, ktoré používajú a spravujú geopriestorové údaje, musia pri minimálnej latencii obslúžiť vysoký počet žiadostí o umiestnenie („Kde ste?“), Aktualizácie polohy („Som tu“) a vyhľadávať údaje podľa polohy („Kto alebo čo je v blízkosti? “).

Jednoduché čítanie (načítanie polohy) a zápisy (aktualizácia polohy) sú náročné z hľadiska rozsahu. Hľadanie ďalších zlúčenín predstavuje výzvu. Kľúčom k splneniu vyššie uvedených požiadaviek je udržiavanie efektívnych indexov údajov. Efektívny index je index, ktorý umožňuje rýchle vyhľadávanie a jeho údržba nie je nákladná (z hľadiska pamäte a výpočtového výkonu).

Vďaka vlastnostiam a výkonu je Redis vynikajúcim riešením pre lokalizačné aplikácie. Chýbala iba natívna podpora geolokačných údajov. Počnúc verziou 3.2 však Redis prichádza s integrovaným geopriestorovým indexovaním. Vývojári aplikácií, ktoré sa spoliehajú na geopriestorové dáta, sa teraz môžu pozrieť na to, ako ich Redis ukladá, spracováva a analyzuje - so všetkou rýchlosťou a jednoduchosťou, na ktorú prišli očakávať od Redis v iných aplikáciách.

Stručné úvodné slovo pre Redis

Redis je úložisko dátových štruktúr v pamäti, ktoré sa bežne používa ako databáza, vyrovnávacia pamäť a sprostredkovateľ správ. Dátové štruktúry v Redise sú ako stavebné bloky Lego a pomáhajú vývojárom dosiahnuť špecifickú funkčnosť s minimálnou zložitosťou. Redis tiež minimalizuje réžiu a latenciu siete, pretože operácie sa vykonávajú mimoriadne efektívne v pamäti, hneď vedľa miesta, kde sú uložené dáta.

Dátové štruktúry Redis zahŕňajú hash, množiny, zoradené množiny, zoznamy, reťazce, bitmapy a HyperLogLogs. Tieto sú vysoko optimalizované a každý z nich poskytuje špecializované príkazy, ktoré vám pomôžu vykonávať zložité funkcie s veľmi malým kódom. Tieto dátové štruktúry robia Redis mimoriadne výkonným a umožňujú aplikáciám založeným na Redis zvládnuť extrémne objemy operácií pri veľmi nízkej latencii.

Zoradené množiny sú obzvlášť významné. Unikátne pre Redis, pridávajú členom zoradené zobrazenie zoradené podľa skóre. Zoradené množiny sú mimoriadne výhodné na spracovanie údajov, ako sú cenové ponuky, hodnosti, body používateľov a časové pečiatky - čo umožňuje vykonať analýzu o niekoľko rádov rýchlejšie v porovnaní s bežnými obchodmi kľúč / hodnota alebo NoSQL.

Geopriestorové indexovanie je implementované v systéme Redis pomocou triedených množín ako základnej dátovej štruktúry, ale s okamžitým kódovaním a dekódovaním údajov o polohe a novými API. To znamená, že indexovanie, vyhľadávanie a triedenie špecifické pre dané miesto je možné všetky preniesť do Redis, s veľmi málo riadkami kódu a veľmi malým úsilím, pomocou zabudovaných príkazov ako GEOADD, GEODIST, GEORADIUSa GEORADIUSBYMEMBER.

Keď skombinujete túto geopriestorovú podporu s inými funkciami Redis, implementácia niektorých zaujímavých funkcií bude extrémne jednoduchá. Napríklad zlúčením nových súborov Geo Sets a PubSub je takmer triviálne nastaviť systém sledovania v reálnom čase, v ktorom sa každá aktualizácia polohy člena zasiela všetkým zainteresovaným stranám (myslite na bežeckú alebo cyklistickú skupinu, kam chcete) sledovať polohy členov skupiny v reálnom čase).

Sada geografických údajov

Sada Geo je základom pre prácu s geopriestorovými údajmi v systéme Redis - je to dátová štruktúra, ktorá sa špecializuje na správu geopriestorových indexov. Každá geografická súprava sa skladá z jedného alebo viacerých členov, pričom každý člen sa skladá z jedinečného identifikátora a dvojice zemepisná dĺžka / šírka. Podobne ako vo všetkých dátových štruktúrach v systéme Redis, aj s geografickými množinami sa manipuluje a dopytuje sa pomocou podmnožiny ľahko použiteľných a zároveň vysoko optimálnych príkazov.

Interne sú geografické sady implementované pomocou zoradenej sady. Zoradené sady vykazujú dobrú časopriestorovú rovnováhu tým, že spotrebúvajú lineárne množstvo pamäte RAM a pri väčšine operácií poskytujú logaritmickú výpočtovú zložitosť.

Vytvorenie a pridanie do indexu

Príkaz Redis na pridávanie členov do geopriestorového indexu sa volá GEOADD. Tento príkaz sa používa na vytváranie nových množín aj na pridávanie členov. Nasledujúci príklad, ilustrovaný z príkazového riadku a klienta Node Redis, demonštruje jeho použitie.

Príklad príkazu Redis:

Miesta GEOADD 10,9971645 45,4435245 Romeo

Príklad uzla Redis:

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

Vyššie uvedené hovorí spoločnosti Redis, aby na uloženie súradníc člena menom Romeo použila geografickú množinu nazývanú miesta. V prípade, že dátová štruktúra polôh neexistuje, najskôr ju vytvorí Redis. Nový člen bude pridaný do indexu len a len vtedy, ak v množine neexistuje.

Je tiež možné pridať viac členov do indexu pomocou jediného volania na GEOADD. Vďaka dávkovaniu viacerých operácií v jednom príkaze táto forma vyvolania znižuje zaťaženie databázy a siete.

Príklad príkazu Redis:

Miesta GEOADD 10,9971645 45,4435245 Mercutio 10,9962165 45,4419226 Júlia

Príklad uzla Redis:

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

Aktualizácia indexu

Po zaznamenaní člena a jeho súradníc do indexu vám Redis umožňuje aktualizovať polohu tohto člena. Aktualizácia členov v geografickej množine sa vykonáva vyvolaním rovnakého príkazu, aký sa použil na ich pridanie, menovite GEOADD. Pri volaní s existujúcimi členmi GEOADD jednoducho aktualizuje priestorové údaje spojené s každým členom o nové hodnoty. Preto hneď ako Romeo opustí dom a začne svoju večernú prechádzku, je možné jeho aktualizovanú polohu zaznamenať nasledujúcim spôsobom.

Príklad príkazu Redis:

Miesta GEOADD 10,999216 45,4432923 Romeo

Príklad uzla Redis:

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

Odstraňovanie členov z indexu

Po pridaní do indexu bude možno potrebné neskôr z neho členov vymazať. Na uľahčenie vymazania členov z geografickej množiny poskytuje Redis ZREM príkaz. Ak chcete vymazať člena (alebo členov) z množiny, ZREM je volaný s príslušným menom kľúča, za ktorým nasledujú členovia, ktorí z neho majú byť vymazaní.

Príklad príkazu Redis:

ZREM pobočky Mercutio

Príklad uzla Redis:

redis.zrem ('locations', 'Mercutio');

Geopriestorový index môže byť úplne odstránený. Pretože je index uložený ako kľúč Redis, znak DEL príkazom je možné ho vymazať.

Čítanie z registra

Údaje v indexe Geo Set je možné načítať niekoľkými spôsobmi. Index sa dá najskôr použiť na skenovanie cez všetkých členov v ňom, či už v jednej veľkej dávke alebo v niekoľkých menších blokoch. Redis poskytuje dva príkazy, ktoré je možné použiť na iteráciu celým indexom: ZRANGE a ZSCAN. Pretože sa však dajú použiť na pokrytie všetkých indexovaných prvkov, je tento typ prístupu k údajom väčšinou vyhradený pre offline a nekritické operácie (napríklad ETL a procesy podávania správ).

Druhým typom prístupu na čítanie do indexu je načítanie súradníc členov a na dosiahnutie tohto cieľa poskytuje Redis dva príkazy. Prvý z týchto príkazov je GEOPOS, ktorá vráti súradnice pre daného člena v súbore Geo. Za predpokladu, že Romeo dodržiava svoju chôdzu, je odpoveď na jeho súčasné miesto pobytu poskytnutá nasledujúcim spôsobom.

Príklad príkazu Redis:

Pobočky GEOPOS Romeo

1)     1) 10.999164

       2) 45.442681 

Príklad uzla Redis:

redis.geopos (‘locations’, ‘Romeo’, function (chyba, odpoveď) {

});

V príklade vyššie je prvým riadkom dopyt, zatiaľ čo nasledujúce riadky predstavujú odpoveď databázy. Redis poskytuje ďalší príkaz s názvom GEOHASH ktorý nahlasuje polohy členov. Aj keď obaja prakticky vykonávajú rovnakú funkciu, rozdiel medzi nimi je v tom, aký je výstup z GEOHASH je zakódovaný ako štandardný geohash (viac o geohashoch nižšie).

Ďalším využitím údajov, ktoré sú uložené v indexe, sú výpočtové vzdialenosti medzi členmi. Pre ľubovoľných dvoch členov v súbore Geo Set GEODIST príkaz vypočíta a vráti vzdialenosť medzi nimi.

Vyhľadávanie v indexe

Posledným a možno najužitočnejším typom prístupu na čítanie, ktorý umožňuje geopriestorový index, je prehľadávanie údajov podľa ich umiestnenia. Najbežnejším príkladom takýchto vyhľadávaní je nájdenie indexovaných členov v určitej vzdialenosti od daného miesta. Na tento účel Redis poskytuje GEORADIUS príkaz.

Ako už názov napovedá, GEORADIUS vykoná hľadanie v kruhu určenom jeho stredom a polomerom a vráti členy, ktoré spadajú do jeho vnútra. Ďalší príkaz Redis, GEORADIUSBYMEMBERslúži rovnakému účelu, ale akceptuje jedného z indexovaných členov ako stred kruhu. Nasleduje príklad takéhoto vyhľadávania.

Príklad príkazu Redis:

GEORADIUSBYMEMBER umiestnenie Romeo 100 m

1) „Júlia“

Príklad uzla Redis:

redis.georadiusbymember („locations“, „Romeo“, „100“, „m“, function (err, reply) {

});

Príkaz na vyhľadávanie tiež podporuje triedenie odpovedí od najbližších po najvzdialenejšie (predvolené) alebo naopak, ako aj vrátenie polohy a vzdialenosti každej odpovede. Redis tiež umožňuje ukladanie odpovedí do inej sady na ďalšie spracovanie (napríklad stránkovanie a operácie sady).

Redis pre geopriestorové údaje

Jednoduchosť implementácie funkčnosti založenej na umiestnení v Redise znamená, že nielen ľahko zvládnete záplavu geodát, ale okrem jednoduchého spracovania môžete implementovať aj inteligenciu. Napríklad vstavaný dopyt s polomerom vám môže pomôcť implementovať jednoduché funkcie, ako napríklad „položky v okolí, ktoré vás zaujímajú“, bez toho, aby ste používateľa alebo aplikáciu prehnali príliš veľkým výberom. Nastaviť operácie križovatky vám môžu pomôcť izolovať „zaujímavé položky“ na základe viacerých filtrov, ako sú geografická poloha, charakteristiky používateľov a predvoľby.

Ďalšou výhodou efektívnosti je spôsob implementácie súborov Redis Geo. Geo súpravy v Redis sú jednoducho ďalšou verziou výkonných zoradených súprav, s hlavným rozdielom, že súpravy Geo používajú geohash zemepisnej dĺžky a šírky polohy ako jej skóre (plus priebežné kódovanie a dekódovanie, ktoré je pre používateľa transparentné). Geohashing, systém, ktorý vynašiel Gustavo Niemeyer, tiež umožňuje vyhľadávať mimoriadne efektívne. Celá množina súradníc polohy sa nemusí porovnávať pri každom vypočítanom čase; znázornenie zaručuje, že vyhľadávanie je možné ľahko obmedziť, a preto je efektívne z časového aj priestorového hľadiska.

Ostatné dostupné knižnice pridávajú zaujímavé funkcie, ako napríklad zahrnutie výšky do výpočtov. Môžete napríklad sledovať dron alebo skupinu dronov v rôznych nadmorských výškach a prenášať senzory, ktoré merajú veterné podmienky alebo teplotné rozdiely v danom mieste. Požadovaná kombinácia množín a zoradených množín je uvedená v tomto xyzsets API v knižnici Geo Lua dostupnej na GitHub.

Výpočty dĺžky trasy, ktoré sú zvyčajne potrebné na navigáciu medzi trasovými bodmi do konkrétnych cieľov, je možné ľahko vykonať pomocou rozhrania geopathlen API. Sledovanie v reálnom čase je ľahko implementované pomocou tohto API na aktualizáciu polohy.

Ak vaša aplikácia akýmkoľvek spôsobom využíva údaje o polohe, zvážte presunutie ťažkej práce do Redis. Pre veľmi veľké dátové súbory by mohlo byť nákladovo efektívnejšie použiť Redis on Flash, ktorý na zaistenie extrémnej priepustnosti a submilisekundovej latencie charakteristickej pre Redis využíva kombináciu RAM a flash pamäte. Ďalšie technické podrobnosti o používaní Redis pre geopriestorové dáta, vrátane vyhľadávania geohash a pokročilých funkcií s Lua, nájdete v dokumente Redis for Geospatial Data.

Itamar Haber je hlavným obhajcom vývojárov spoločnosti Redis Labs.

Nové technologické fórum poskytuje miesto na preskúmanie a diskusiu o vznikajúcich podnikových technológiách v nebývalej hĺbke a šírke. Výber je subjektívny, založený na našom výbere technológií, ktoré považujeme za dôležité a pre čitateľov najväčší záujem. neprijíma marketingové záruky na zverejnenie a vyhradzuje si právo upravovať všetok prispievaný obsah. Všetky otázky posielajte na adresu [email protected].

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