Programování

Vytvářejte geoprostorové aplikace s Redisem

Pro rostoucí počet aplikací je zásadní sledování polohy. Sociální aplikace může spojovat uživatele na základě umístění. Aplikace pro pohostinství nebo cestování může pomocí polohy uživatele upozornit na zajímavá místa nebo poskytnout vlastní itinerář. Aplikace senzoru může ukládat a analyzovat data, která jsou geoprostorová i časová řada, aby spustila akci, jako je detekce vzorů, odlehlých hodnot a anomálií.

Jak geoprostorová technologie dozrává, aplikace založené na poloze se dále vyvíjejí z převážně mapovacích aplikací na sofistikované špičkové programy, které zpracovávají a analyzují miliony datových bodů od mobilních uživatelů, senzorových sítí, zařízení IoT a dalších zdrojů. Svět je v neustálém pohybu a naše aplikace se začínají chytat.

Data o poloze představují pro vývojáře zajímavou výzvu, protože jejich dotazování nebo provádění výpočtů polohy a vzdálenosti musí zohledňovat zeměpisnou délku (x), šířku (y) a někdy i nadmořskou výšku (z). Multidimenzionální povaha údajů o poloze vyžaduje optimalizované mechanismy jejich zpracování - považovat je za pouhá celá čísla je vysoce neúčinné. Pokud databáze, ať už úložiště RDBMS nebo NoSQL, postrádá možnosti pro zpracování geoprostorových dat, aplikační programátoři musí provést další práci s předzpracováním dat, nebo musí vytvořit logiku, která s daty zachází jako s geoprostorovými.

Zpracování geoprostorových dat je také výzvou velkých dat v reálném čase. Aplikace, které používají a spravují geoprostorová data, musí při minimální latenci poskytovat vysoký počet žádostí o umístění („Kde jste?“), Aktualizace polohy („Jsem tady“) a hledat data podle místa („Kdo nebo co je poblíž? “).

Jednoduché čtení (umístění načítání) a zápisy (umístění aktualizace) jsou v měřítku náročné. Hledání dalších sloučenin výzvu. Klíčem ke splnění výše uvedených požadavků je udržování účinných indexů pro data. Efektivní index je index, který umožňuje rychlé vyhledávání a jeho údržba není nákladná (z hlediska paměti a výpočetního výkonu).

Díky vlastnostem a výkonu Redis se výborně hodí pro aplikace založené na poloze. Chyběla pouze nativní podpora geolokačních dat. Počínaje verzí 3.2 však Redis přichází s vestavěným geoprostorovým indexováním. Vývojáři aplikací, kteří spoléhají na geoprostorová data, se nyní mohou podívat na Redis, aby jej uložili, zpracovali a analyzovali - se vší rychlostí a jednoduchostí, na kterou přišli očekávat od Redis v jiných aplikacích.

Krátký úvod do Redis

Redis je úložiště datové struktury v paměti, které se běžně používá jako databáze, mezipaměť a zprostředkovatel zpráv. Datové struktury v Redisu jsou jako stavební bloky Lego a pomáhají vývojářům dosáhnout specifické funkce s minimální složitostí. Redis také minimalizuje režii a latenci sítě, protože operace jsou prováděny extrémně efektivně v paměti, hned vedle místa, kde jsou data uložena.

Datové struktury Redis zahrnují hash, sady, seřazené sady, seznamy, řetězce, bitmapy a HyperLogLogs. Jedná se o vysoce optimalizované, z nichž každý poskytuje specializované příkazy, které vám pomohou spouštět složité funkce s velmi malým množstvím kódu. Tyto datové struktury činí Redis extrémně výkonným a umožňují aplikacím založeným na Redis zvládat extrémní objemy operací při velmi nízké latenci.

Tříděné sady jsou obzvláště významné. Unikátní pro Redis, přidávají členům seřazené zobrazení seřazené podle skóre. Seřazené sady jsou nesmírně výhodné pro zpracování dat, jako jsou nabídky, hodnosti, uživatelské body a časová razítka - což umožňuje provádět analýzu o několik řádů rychleji ve srovnání s běžnými obchody klíč / hodnota nebo NoSQL.

Geoprostorové indexování je implementováno v Redis pomocí tříděných sad jako základní datové struktury, ale s on-the-fly kódováním a dekódováním dat o poloze a nových API. To znamená, že indexování, vyhledávání a třídění specifické pro dané místo lze všechny vyložit do Redis, s velmi málo řádky kódu a velmi malým úsilím, pomocí vestavěných příkazů, jako je GEOADD, GEODIST, GEORADIUS, a GEORADIUSBYMEMBER.

Když zkombinujete tuto geoprostorovou podporu s dalšími funkcemi Redis, stane se implementace některých zajímavých funkcí extrémně snadnou. Například sloučením nových sad Geo a PubSub je téměř triviální nastavit systém sledování v reálném čase, ve kterém je každá aktualizace polohy člena zasílána všem zúčastněným stranám (myslete na běžeckou nebo cyklistickou skupinu, kde chcete) sledovat umístění členů skupiny v reálném čase).

Geo sada

Sada Geo je základem pro práci s geoprostorovými daty v Redis - je to datová struktura, která se specializuje na správu geoprostorových indexů. Každá sada Geo se skládá z jednoho nebo více členů, přičemž každý člen se skládá z jedinečného identifikátoru a dvojice zeměpisná délka / šířka. Podobně jako všechny datové struktury v Redis, Geo Sets jsou manipulovány a dotazovány pomocí podmnožiny snadno použitelných a zároveň vysoce optimálních příkazů.

Interně jsou geografické sady implementovány pomocí seřazené sady. Seřazené sady vykazují dobrou časoprostorovou rovnováhu tím, že spotřebovávají lineární množství paměti RAM a zároveň zajišťují logaritmickou výpočetní složitost pro většinu operací.

Vytvoření a přidání do indexu

Příkaz Redis pro přidání členů do geoprostorového indexu se nazývá GEOADD. Tento příkaz se používá jak pro vytváření nových sad, tak pro přidávání členů. Následující příklad, ilustrovaný z příkazového řádku a klienta Node Redis, ukazuje jeho použití.

Příklad příkazu Redis:

Místa GEOADD 10,9971645 45,4435245 Romeo

Příklad uzlu Redis:

redis.geoadd („umístění“, „10. 9971645“, „45. 4435245“, „Romeo“);

Výše uvedené říká Redisovi, aby pro uložení souřadnic člena jménem Romeo použil Geo Set nazývaný místa. V případě, že datová struktura lokalit neexistuje, bude nejprve vytvořena Redisem. Nový člen bude přidán do indexu právě tehdy, pokud v sadě neexistuje.

Je také možné přidat více členů do indexu pomocí jediného volání GEOADD. Dávkovým zpracováním více operací v jediném příkazu snižuje tato forma vyvolání zatížení databáze a sítě.

Příklad příkazu Redis:

Místa GEOADD 10,9971645 45,4435245 Mercutio 10,9962165 45,4419226 Julie

Příklad uzlu Redis:

redis.geoadd („umístění“, „10. 9971645“, „45. 4435245“, „Mercutio“, „10. 9962165“, „45. 4419226“, „Julie“);

Aktualizace indexu

Poté, co byl člen a jeho souřadnice zaznamenány do indexu, vám Redis umožňuje aktualizovat polohu daného člena. Aktualizace členů v geografické sadě se provádí voláním stejného příkazu, který se používá k jejich přidání, jmenovitě GEOADD. Při volání se stávajícími členy GEOADD jednoduše aktualizuje prostorová data spojená s každým členem o nové hodnoty. Jakmile tedy Romeo opustí dům a zahájí svou večerní procházku, lze jeho aktualizovanou polohu zaznamenat následujícím způsobem.

Příklad příkazu Redis:

Místa GEOADD 10,999216 45,4432923 Romeo

Příklad uzlu Redis:

redis.geoadd („umístění“, „10. 999216“, „45. 4432923“, „Romeo“);

Odebírání členů z indexu

Po přidání do rejstříku bude pravděpodobně nutné členy z něj později odstranit. Pro usnadnění mazání členů z Geo Setu poskytuje Redis ZREM příkaz. Chcete-li odstranit člena (nebo členy) ze sady, ZREM je volán s příslušným názvem klíče následovaný členy, které mají být z něj odstraněny.

Příklad příkazu Redis:

Umístění ZREM Mercutio

Příklad uzlu Redis:

redis.zrem ('umístění', 'Mercutio');

Geoprostorový index může být zcela smazán. Vzhledem k tomu, že index je uložen jako klíč Redis, DEL lze jej smazat pomocí příkazu.

Čtení z rejstříku

Data v indexu Geo Set lze číst několika způsoby. Nejprve lze index použít pro skenování všech členů v něm, ať už v jedné velké dávce nebo v několika menších blocích. Redis poskytuje dva příkazy, které lze použít k iteraci celým indexem: ZRANGE a ZSCAN. Protože je však lze použít k pokrytí všech indexovaných prvků, je tento typ přístupu k datům většinou vyhrazen pro offline, nekritické operace (například ETL a procesy podávání zpráv).

Druhým typem přístupu pro čtení do indexu je načítání souřadnic členů a k dosažení toho, že Redis poskytuje dva příkazy. První z těchto příkazů je GEOPOS, který vrací souřadnice pro daného člena v Geo Setu. Za předpokladu, že Romeo drží krok, odpověď týkající se jeho současného pobytu poskytuje následující.

Příklad příkazu Redis:

Místa GEOPOS Romeo

1)     1) 10.999164

       2) 45.442681 

Příklad uzlu Redis:

redis.geopos („umístění“, „Romeo“, funkce (chyba, odpověď) {

});

Ve výše uvedeném příkladu je prvním řádkem dotaz, zatímco následující řádky představují odpověď databáze. Redis poskytuje další příkaz s názvem GEOHASH který hlásí umístění členů. Zatímco oba prakticky plní stejnou funkci, rozdíl mezi nimi je v tom, že výstup GEOHASH je zakódován jako standardní geohash (více o geohashech níže).

Dalším použitím pro data uložená v indexu jsou výpočetní vzdálenosti mezi členy. Pro kterékoli dva členy v Geo Setu je GEODIST příkaz vypočítá a vrátí vzdálenost mezi nimi.

Hledání v indexu

Posledním a možná nejužitečnějším typem přístupu ke čtení, který geoprostorový index umožňuje, je prohledávání dat podle jeho umístění. Nejběžnějším příkladem takových hledání je hledání indexovaných členů v určité vzdálenosti od daného místa. Za tímto účelem poskytuje Redis GEORADIUS příkaz.

Jak název napovídá, GEORADIUS provede vyhledávání v kruhu daném jeho středem a poloměrem a vrátí členy, které do něj spadají. Další příkaz Redis, GEORADIUSBYMEMBER, slouží stejnému účelu, ale přijímá jeden z indexovaných členů jako střed kruhu. Následuje příklad takového vyhledávání.

Příklad příkazu Redis:

GEORADIUSBYMEMBER umístění Romeo 100 m

1) „Juliet“

Příklad uzlu Redis:

redis.georadiusbymember („umístění“, „Romeo“, „100“, „m“, funkce (chyba, odpověď) {

});

Příkaz pro vyhledávání také podporuje řazení odpovědí od nejbližší k nejvzdálenější (výchozí) nebo naopak, stejně jako vrácení umístění a vzdálenosti každé odpovědi. Redis také umožňuje uložit odpověď v jiné sadě pro další zpracování (například stránkování a operace sady).

Redis pro geoprostorová data

Jednoduchost implementace funkcí založených na umístění v Redis znamená, že můžete nejen snadno zvládnout záplavu geodat, ale také implementovat inteligenci nad rámec jednoduchého zpracování. Například integrovaný poloměrový dotaz vám může pomoci implementovat jednoduché funkce, jako jsou „blízké položky zájmu“, aniž byste museli uživatele nebo aplikaci zaplavovat příliš mnoha možnostmi. Nastavit operace křižovatky vám pomůže izolovat „zajímavé položky“ na základě více filtrů, jako je zeměpisná poloha, uživatelské charakteristiky a předvolby.

Další výhoda v efektivitě plyne ze způsobu implementace sad Redis Geo. Geo sady v Redisu jsou jednoduše další verzí výkonných setříděných sad s tím rozdílem, že sady Geo používají geohash zeměpisné délky a šířky místa jako jeho skóre (plus přímé kódování a dekódování, které je pro uživatele transparentní). Geohashing, systém, který vynalezl Gustavo Niemeyer, také umožňuje vyhledávat velmi efektivně. Celá sada souřadnic polohy nemusí být porovnávána při každé vypočítané časové vzdálenosti; reprezentace zajišťuje, že vyhledávání lze snadno omezit, a proto se stane časově i prostorově efektivním.

Jiné dostupné knihovny přidávají zajímavé funkce, například zahrnutí nadmořské výšky do výpočtů. Například můžete sledovat dron nebo skupinu dronů v různých nadmořských výškách a přenášet senzory, které měří větrné podmínky nebo teplotní rozdíly v místě. Požadovaná kombinace sad a seřazených sad je poskytována v tomto xyzsets API v knihovně Geo Lua dostupné na GitHubu.

Výpočty délky trasy, obvykle potřebné pro navigaci mezi body na trase do konkrétních cílů, lze snadno provést pomocí geopathlen API. Sledování v reálném čase je snadno implementováno pomocí tohoto rozhraní API pro aktualizaci umístění.

Pokud vaše aplikace jakýmkoli způsobem využívá data o poloze, zvažte, jak z Redis vyložit hodně tvrdé práce. U velmi velkých datových sad by mohlo být nákladově efektivnější použít Redis ve Flashi, který k zajištění extrémní propustnosti a submilisekundové latence charakteristické pro Redis využívá kombinaci RAM a flash paměti. Další technické podrobnosti o používání Redis pro geoprostorová data, včetně vyhledávání geohash a pokročilých funkcí s Lua, najdete v dokumentu Redis for Geospatial Data.

Itamar Haber je hlavním obhájcem vývojářů společnosti Redis Labs.

Nové technologické fórum poskytuje místo, kde můžete prozkoumat a diskutovat o nově vznikajících podnikových technologiích v nebývalé hloubce a šíři. Výběr je subjektivní, založený na našem výběru technologií, které považujeme za důležité a pro čtenáře nejzajímavější. nepřijímá marketingové materiály ke zveřejnění a vyhrazuje si právo upravovat veškerý přispěný obsah. Všechny dotazy zasílejte na [email protected]