Bina aplikasi geospatial dengan Redis

Untuk peningkatan jumlah aplikasi, lokasi penjejakan sangat penting. Aplikasi sosial mungkin menghubungkan pengguna berdasarkan lokasi. Aplikasi perhotelan atau perjalanan mungkin menggunakan lokasi pengguna untuk menunjukkan tempat menarik atau menyediakan jadual perjalanan khusus. Aplikasi sensor mungkin menyimpan dan menganalisis data yang berupa geospasial dan seri waktu, untuk memicu tindakan seperti mengesan corak, garis besar, dan anomali.

Selanjutnya, ketika teknologi geospasial matang, aplikasi berbasis lokasi berkembang dari pemetaan aplikasi terutama menjadi program canggih dan canggih yang memproses dan menganalisis jutaan titik data dari pengguna mudah alih, rangkaian sensor, peranti IoT, dan sumber lain. Dunia sentiasa bergerak, dan aplikasi kita mula terserlah.

Data lokasi memberikan cabaran yang menarik bagi pembangun kerana menanyakannya atau melakukan pengiraan kedudukan dan jarak harus mempertimbangkan garis bujur (x), garis lintang (y), dan kadang-kadang ketinggian (z). Sifat data lokasi yang multidimensi memerlukan mekanisme yang dioptimumkan untuk memprosesnya - menganggapnya sebagai bilangan bulat sangat tidak berkesan. Sekiranya pangkalan data, sama ada RDBMS atau kedai NoSQL, tidak memiliki kemampuan untuk menangani data geospasial, pengaturcara aplikasi harus melakukan pekerjaan tambahan untuk memproses data, atau mereka harus membangun logik yang memperlakukan data sebagai geospasial.

Memproses data geospatial juga merupakan cabaran data besar masa nyata. Aplikasi yang menggunakan dan mengurus data geospasial mesti melayani, pada latensi minimum, sejumlah besar permintaan untuk lokasi ("Di mana Anda?"), Kemas kini ke lokasi ("Saya di sini"), dan mencari data berdasarkan lokasi ("Siapa atau apa yang berdekatan? ”).

Bacaan sederhana (ambil lokasi) dan tulis (kemas kini lokasi) sangat mencabar. Pencarian lebih jauh menyukarkan cabaran. Kunci untuk memenuhi syarat di atas adalah mengekalkan indeks yang berkesan untuk data. Indeks berkesan adalah indeks yang dapat memudahkan pencarian pantas dan tidak mahal untuk dikekalkan (dari segi daya ingatan dan perkiraan).

Ciri dan prestasi Redis menjadikannya sangat sesuai untuk aplikasi berdasarkan lokasi. Yang hilang hanyalah sokongan asli untuk data geolokasi. Namun, bermula dengan versi 3.2, Redis dilengkapi dengan pengindeksan geospasial. Pembangun aplikasi yang bergantung pada data geospasial kini dapat melihat Redis untuk menyimpan, memproses, dan menganalisisnya - dengan semua kelajuan dan kesederhanaan yang mereka dapat sampai sekarang mengharapkan dari Redis dalam aplikasi lain.

Pengenalan ringkas kepada Redis

Redis adalah gedung struktur data dalam memori yang biasanya digunakan sebagai pangkalan data, cache, dan broker mesej. Struktur data di Redis seperti blok bangunan Lego, membantu pembangun mencapai fungsi tertentu dengan kerumitan minimum. Redis juga meminimumkan overhead dan latensi rangkaian kerana operasi dijalankan dengan sangat berkesan dalam memori, tepat di sebelah tempat data disimpan.

Struktur data Redis merangkumi Hash, Sets, Sorted Sets, Senarai, String, Bitmap, dan HyperLogLogs. Ini sangat dioptimumkan, masing-masing memberikan perintah khusus yang membantu anda melaksanakan fungsi yang kompleks dengan kod yang sangat sedikit. Struktur data ini menjadikan Redis sangat kuat dan membolehkan aplikasi berasaskan Redis menangani operasi yang banyak pada latensi yang sangat rendah.

Set yang disusun sangat ketara. Yang unik untuk Redis, mereka menambah pandangan yang disusun kepada ahli, disusun mengikut skor. Kumpulan yang disusun sangat menguntungkan untuk memproses data seperti tawaran, pangkat, titik pengguna, dan setem masa - memungkinkan analisis dilakukan dengan beberapa pesanan besar lebih cepat berbanding dengan kunci / nilai biasa atau kedai NoSQL.

Pengindeksan geospasial dilaksanakan di Redis menggunakan Kumpulan Diurutkan sebagai struktur data yang mendasari, tetapi dengan pengekodan dan penyahkodan data lokasi dan API baru. Ini cara yang pengindeksan khusus lokasi, mencari, dan menyusun semua boleh dipunggah ke Redis, dengan sangat sedikit baris kod dan usaha yang sedikit, menggunakan terbina dalam perintah seperti GEOADD, GEODIST, GEORADIUS, dan GEORADIUSBYMEMBER.

Apabila anda menggabungkan sokongan geospasial ini dengan keupayaan Redis yang lain, beberapa fungsi menarik menjadi sangat mudah untuk dilaksanakan. Sebagai contoh, dengan menggabungkan Geo Sets dan PubSub yang baru, hampir mustahil untuk menubuhkan sistem penjejakan masa nyata di mana setiap kemas kini kedudukan ahli dihantar kepada semua pihak yang berminat (fikirkan kumpulan lari atau berbasikal di mana anda mahu untuk mengesan lokasi ahli kumpulan dalam masa nyata).

Set Geo

Set Geo adalah asas untuk bekerja dengan data geospasial di Redis - ini adalah struktur data yang khusus untuk mengurus indeks geospasial. Setiap Set Geo terdiri daripada satu atau lebih ahli, dengan setiap anggota terdiri daripada pengecam unik dan pasangan bujur / garis lintang. Mirip dengan semua struktur data di Redis, Set Geo dimanipulasi dan disoal menggunakan subset yang mudah digunakan dan pada masa yang sama perintah yang sangat optimum.

Secara dalaman, Set Geo dilaksanakan dengan Set Diurutkan. Kumpulan yang disusun menunjukkan keseimbangan ruang-waktu yang baik dengan menggunakan jumlah RAM linear sambil memberikan kerumitan pengkomputeran logaritma untuk kebanyakan operasi.

Membuat dan menambah indeks

Perintah Redis untuk menambahkan ahli ke indeks geospasial dipanggil GEOADD. Perintah ini digunakan untuk membuat set baru dan untuk menambah ahli. Contoh berikut, yang digambarkan dari baris perintah dan pelanggan Node Redis, menunjukkan penggunaannya.

Contoh arahan Redis:

GEOADD locations 10.9971645 45.4435245 Romeo

Contoh Node Redis:

redis.geoadd(‘locations’, ‘10.9971645’, ‘45.4435245’, ‘Romeo’);

Perkara di atas memberitahu Redis untuk menggunakan Set Geo yang disebut lokasi untuk menyimpan koordinat anggota bernama Romeo. Sekiranya struktur data lokasi tidak ada, ia akan dibuat terlebih dahulu oleh Redis. Anggota baru akan ditambahkan ke indeks jika dan hanya jika ia tidak ada dalam kumpulan.

Anda juga boleh menambahkan beberapa ahli ke indeks dengan satu panggilan ke GEOADD. Dengan mengumpulkan banyak operasi dalam satu perintah, bentuk permohonan ini dapat mengurangkan beban pada pangkalan data dan rangkaian.  

Contoh arahan Redis:

GEOADD locations 10.9971645 45.4435245 Mercutio 10.9962165 45.4419226 Juliet

Contoh Node Redis:

redis.geoadd(‘locations’, ‘10.9971645’, ‘45.4435245’, ‘Mercutio’, ‘10.9962165’, ’45.4419226’, ‘Juliet’);

Mengemas kini indeks

Setelah ahli dan koordinatnya direkodkan dalam indeks, Redis membolehkan anda mengemas kini lokasi ahli tersebut. Mengemas kini anggota dalam Set Geo dilakukan dengan memanggil perintah yang sama yang digunakan untuk menambahkannya, yaitu GEOADD. Apabila dipanggil dengan ahli yang ada, GEOADDcukup kemas kini data spasial yang dikaitkan dengan setiap anggota dengan nilai baru. Oleh itu, sebaik sahaja Romeo keluar dari rumah untuk memulakan berjalan-jalan malamnya, lokasinya yang dikemas kini dapat dirakam dengan yang berikut.

Contoh arahan Redis:

GEOADD locations 10.999216 45.4432923 Romeo

Contoh Node Redis:

redis.geoadd(‘locations’, ‘10.999216’, ‘45.4432923’, ‘Romeo’);

Mengeluarkan ahli dari indeks

Setelah ditambahkan ke indeks, ahli mungkin perlu dihapuskan dari itu di lain waktu. Untuk memudahkan penghapusan anggota dari Set Geo, Redis memberikan ZREMarahan. Untuk menghapus anggota (atau anggota) dari set, ZREMdipanggil dengan nama kunci yang sesuai diikuti oleh anggota untuk dihapuskan daripadanya.

Contoh arahan Redis:

ZREM locations Mercutio

Contoh Node Redis:

redis.zrem(‘locations’, ‘Mercutio’);

Indeks geospatial boleh dihapuskan sepenuhnya. Oleh kerana indeks disimpan sebagai kunci Redis, DELperintah itu dapat digunakan untuk menghapusnya.

Bacaan dari indeks

Data dalam indeks Set Geo dapat dibaca dengan beberapa cara. Pertama, indeks boleh digunakan untuk mengimbas semua anggota di dalamnya, sama ada dalam satu kumpulan besar atau dalam beberapa potongan yang lebih kecil. Redis menyediakan dua arahan yang dapat digunakan untuk melakukan lelaran ke seluruh indeks: ZRANGEdan ZSCAN. Walau bagaimanapun, kerana ini dapat digunakan untuk merangkumi semua elemen yang diindeks, jenis akses ke data ini kebanyakannya dikhaskan untuk operasi luar talian, bukan kritikal (misalnya, ETL dan proses pelaporan).

Jenis akses baca kedua ke indeks adalah untuk mengambil koordinat anggota, dan untuk mencapai itu Redis memberikan dua perintah. Yang pertama dari perintah ini adalah GEOPOS, yang mengembalikan koordinat untuk anggota tertentu dalam Set Geo. Dengan andaian bahawa Romeo mengikuti jalannya, jawapan mengenai keberadaannya sekarang diberikan dengan melaksanakan perkara berikut.

Contoh arahan Redis:

GEOPOS locations Romeo

1)     1) 10.999164

       2) 45.442681 

Contoh Node Redis:

redis.geopos(‘locations’, ‘Romeo’, function(err, reply) {

});

Dalam contoh di atas, baris pertama adalah pertanyaan, sedangkan baris berikut adalah respons pangkalan data. Redis memberikan arahan lain yang disebut GEOHASHyang melaporkan lokasi anggota. Walaupun kedua-duanya secara praktikal menjalankan fungsi yang sama, perbezaan di antara keduanya adalah bahawa output GEOHASHdikodkan sebagai geohash standard (lebih banyak pada geohash di bawah)

Penggunaan lain untuk data yang disimpan dalam indeks adalah mengira jarak antara anggota. Untuk mana-mana dua anggota dalam Set Geo, GEODISTperintah akan menghitung dan mengembalikan jarak antara mereka.

Mencari indeks

Jenis akses baca yang terakhir dan mungkin paling berguna yang diaktifkan oleh indeks geospasial adalah mencari data mengikut lokasinya. Contoh carian yang paling biasa adalah mencari anggota yang diindeks dalam jarak tertentu dari lokasi tertentu. Untuk tujuan itu, Redis memberikan GEORADIUSarahan.

Seperti namanya, GEORADIUSmelakukan pencarian dalam lingkaran yang diberikan oleh pusatnya dan jejarinya dan mengembalikan anggota yang jatuh di dalamnya. Perintah Redis lain GEORADIUSBYMEMBER, melayani tujuan yang sama tetapi menerima salah satu anggota yang diindeks sebagai pusat bulatan. Berikut adalah contoh carian sedemikian.

Contoh arahan Redis:

GEORADIUSBYMEMBER locations Romeo 100 m

1) “Juliet”

Contoh Node Redis:

redis.georadiusbymember(‘locations’, ‘Romeo’, ‘100’, ‘m’, function(err, reply) {

});

Perintah carian juga menyokong menyusun balasan dari yang terdekat ke yang paling jauh (lalai) atau sebaliknya, serta mengembalikan lokasi dan jarak setiap balasan. Redis juga membolehkan menyimpan balasan di Set lain untuk diproses lebih lanjut (seperti operasi paging dan Set).

Redis semula untuk data geospasial

Kesederhanaan dalam melaksanakan fungsi berdasarkan lokasi di Redis bermaksud bahawa anda bukan sahaja dapat mengatasi banjir geodata dengan mudah, tetapi juga melaksanakan kecerdasan di samping pemprosesan mudah. Contohnya, pertanyaan radius terbina dalam dapat membantu anda melaksanakan fungsi mudah seperti "item menarik" tanpa menukar pengguna atau aplikasi anda dengan terlalu banyak pilihan. Menetapkan operasi persimpangan dapat membantu anda mengasingkan "item menarik" berdasarkan beberapa penapis seperti lokasi geografi, ciri pengguna, dan pilihan.

Manfaat lain dalam kecekapan diperoleh dari cara pelaksanaan set Redis Geo. Set Geo di Redis hanyalah versi lain dari Kumpulan Diurut yang kuat, dengan perbezaan utama bahawa Set Geo menggunakan geohashgaris bujur dan garis lintang lokasi sebagai skornya (ditambah pengekodan dan penyahkodan on-the-fly yang transparan kepada pengguna). Geohashing, sistem yang diciptakan oleh Gustavo Niemeyer, juga memungkinkan untuk mencari dengan sangat berkesan. Keseluruhan set koordinat lokasi tidak perlu dibandingkan setiap jarak masa dikira; perwakilan memastikan bahawa carian dapat dibatasi dengan mudah dan oleh itu menjadi kecekapan masa dan ruang.

Perpustakaan lain yang ada menambah keupayaan menarik, seperti memasukkan ketinggian dalam pengiraan. Sebagai contoh, anda mungkin mengesan drone atau kumpulan drone pada ketinggian yang berbeza, membawa sensor yang mengukur keadaan angin atau perbezaan suhu di suatu lokasi. Gabungan Set dan Sortir yang diperlukan disediakan dalam API xyzsets ini di perpustakaan Geo Lua yang terdapat di GitHub.

Pengiraan panjang jalur, biasanya diperlukan untuk menavigasi antara titik jalan ke destinasi tertentu, dapat dicapai dengan mudah dengan API geopathlen. Penjejakan masa nyata mudah dilaksanakan dengan API kemas kini lokasi ini.

Sekiranya aplikasi anda menggunakan data lokasi dengan cara apa pun, pertimbangkan untuk memuatkan banyak kerja keras kepada Redis. Untuk set data yang sangat besar, mungkin lebih menjimatkan penggunaan Redis pada Flash, yang menggunakan kombinasi RAM dan memori flash untuk memberikan ciri-ciri latensi melampau dan latensi submillisecond Redis. Untuk maklumat lebih terperinci mengenai penggunaan Redis untuk data geospasial, termasuk pencarian geohash dan kemampuan maju dengan Lua, lihat buku putih Redis for Geospatial Data.

Itamar Haber adalah ketua penyokong pembangunan Redis Labs.

Forum Teknologi Baru menyediakan tempat untuk meneroka dan membincangkan teknologi perusahaan yang baru muncul dalam kedalaman dan luas yang belum pernah terjadi sebelumnya. Pemilihannya bersifat subjektif, berdasarkan pilihan teknologi yang kami percayai penting dan menarik minat pembaca. tidak menerima jaminan pemasaran untuk penerbitan dan berhak untuk mengedit semua kandungan yang disumbangkan. Hantarkan semua pertanyaan ke [email protected]