Bangun aplikasi geospasial dengan Redis

Untuk semakin banyak aplikasi, pelacakan lokasi sangat penting. Aplikasi sosial mungkin menghubungkan pengguna berdasarkan lokasi. Aplikasi perhotelan atau perjalanan mungkin menggunakan lokasi pengguna untuk menunjukkan pemandangan yang menarik atau menyediakan rencana perjalanan khusus. Aplikasi sensor mungkin menyimpan dan menganalisis data yang berupa geospasial dan deret waktu, untuk memicu tindakan seperti mendeteksi pola, pencilan, dan anomali.

Lebih lanjut, seiring dengan kematangan teknologi geospasial, aplikasi berbasis lokasi berkembang dari sebagian besar aplikasi pemetaan menjadi program canggih dan mutakhir yang memproses dan menganalisis jutaan titik data dari pengguna seluler, jaringan sensor, perangkat IoT, dan sumber lainnya. Dunia terus bergerak, dan aplikasi kita mulai populer.

Data lokasi menghadirkan tantangan yang menarik bagi pengembang karena melakukan kueri atau melakukan penghitungan posisi dan jarak harus mempertimbangkan bujur (x), lintang (y), dan terkadang bahkan ketinggian (z). Sifat multidimensi dari data lokasi membutuhkan mekanisme yang dioptimalkan untuk memprosesnya - memperlakukannya hanya sebagai bilangan bulat sangat tidak efisien. Jika database, apakah penyimpanan RDBMS atau NoSQL, tidak memiliki kemampuan untuk menangani data geospasial, pemrogram aplikasi harus melakukan pekerjaan ekstra untuk memproses data, atau mereka harus membangun logika yang memperlakukan data sebagai geospasial.

Memproses data geospasial juga merupakan tantangan data besar secara real-time. Aplikasi yang menggunakan dan mengelola data geospasial harus melayani, pada latensi minimal, sejumlah besar permintaan lokasi ("Di mana Anda?"), Pembaruan lokasi ("Saya di sini"), dan mencari data berdasarkan lokasi ("Siapa atau apa yang terdekat? ”).

Pembacaan sederhana (mengambil lokasi) dan menulis (memperbarui lokasi) menantang dalam skala besar. Pencarian lebih lanjut menambah tantangan. Kunci untuk memenuhi persyaratan di atas adalah mempertahankan indeks data yang efektif. Indeks yang efektif adalah indeks yang dapat memfasilitasi pencarian cepat dan pemeliharaannya tidak mahal (dalam hal memori dan daya komputasi).

Karakteristik dan kinerja Redis membuatnya sangat cocok untuk aplikasi berbasis lokasi. Semua yang hilang adalah dukungan asli untuk data geolokasi. Namun, dimulai dengan versi 3.2, Redis hadir dengan pengindeksan geospasial bawaan. Pengembang aplikasi yang mengandalkan data geospasial sekarang dapat melihat ke Redis untuk menyimpan, memproses, dan menganalisisnya - dengan semua kecepatan dan kesederhanaan yang mereka miliki. harapkan dari Redis di aplikasi lain.

Pengantar singkat tentang Redis

Redis adalah penyimpanan struktur data dalam memori yang biasanya digunakan sebagai database, cache, dan perantara pesan. Struktur data di Redis seperti blok penyusun Lego, membantu pengembang mencapai fungsionalitas tertentu dengan kerumitan minimal. Redis juga meminimalkan overhead dan latensi jaringan karena operasi dijalankan dengan sangat efisien dalam memori, tepat di sebelah tempat data disimpan.

Struktur data Redis mencakup Hash, Kumpulan, Kumpulan yang Diurutkan, Daftar, String, Bitmap, dan HyperLogLogs. Ini sangat dioptimalkan, masing-masing menyediakan perintah khusus yang membantu Anda menjalankan fungsionalitas kompleks dengan kode yang sangat sedikit. Struktur data ini membuat Redis sangat kuat dan memungkinkan aplikasi berbasis Redis menangani volume operasi yang ekstrem pada latensi yang sangat rendah.

Set yang Diurutkan sangat penting. Unik untuk Redis, mereka menambahkan tampilan berurutan ke anggota, diurutkan berdasarkan skor. Set yang Diurutkan sangat bermanfaat untuk memproses data seperti tawaran, peringkat, poin pengguna, dan stempel waktu - memungkinkan analisis dilakukan beberapa kali lipat lebih cepat dibandingkan dengan penyimpanan kunci / nilai atau NoSQL biasa.

Pengindeksan geospasial diimplementasikan di Redis menggunakan Sorted Sets sebagai struktur data yang mendasarinya, tetapi dengan encoding dan decoding on-the-fly data lokasi dan API baru. Ini berarti bahwa lokasi spesifik pengindeksan, pencarian, dan menyortir semua bisa diturunkan untuk Redis, dengan sangat sedikit baris kode dan sedikit usaha, menggunakan built-in perintah seperti GEOADD, GEODIST, GEORADIUS, dan GEORADIUSBYMEMBER.

Saat Anda menggabungkan dukungan geospasial ini dengan kemampuan Redis lainnya, beberapa fungsi menarik menjadi sangat mudah diterapkan. Misalnya, dengan menggabungkan Kumpulan Geografis baru dan PubSub, hampir tidak mudah untuk menyiapkan sistem pelacakan waktu nyata di mana setiap pembaruan posisi anggota dikirim ke semua pihak yang berkepentingan (pikirkan grup lari atau bersepeda yang Anda inginkan untuk melacak lokasi anggota grup secara real time).

Set Geo

Set Geo adalah dasar untuk bekerja dengan data geospasial di Redis - ini adalah struktur data yang dikhususkan untuk mengelola indeks geospasial. Setiap Kumpulan Geografis terdiri dari satu atau lebih anggota, dengan setiap anggota terdiri dari pengenal unik dan pasangan bujur / lintang. Mirip dengan semua struktur data di Redis, Kumpulan Geografis dimanipulasi dan dikueri menggunakan subset perintah yang mudah digunakan dan pada saat yang sama sangat optimal.

Secara internal, Geo Sets diimplementasikan dengan Sorted Set. Set yang Diurutkan menunjukkan keseimbangan ruang-waktu yang baik dengan menggunakan sejumlah RAM linier sambil menyediakan kompleksitas komputasi logaritmik untuk sebagian besar operasi.

Membuat dan menambah indeks

Perintah Redis untuk menambahkan anggota ke indeks geospasial dipanggil GEOADD. Perintah ini digunakan baik untuk membuat set baru dan untuk menambahkan anggota. Contoh berikut, diilustrasikan dari baris perintah dan klien Node Redis, mendemonstrasikan penggunaannya.

Contoh perintah Redis:

GEOADD locations 10.9971645 45.4435245 Romeo

Contoh Node Redis:

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

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

Dimungkinkan juga untuk menambahkan beberapa anggota ke indeks dengan satu panggilan ke GEOADD. Dengan menggabungkan beberapa operasi dalam satu perintah, bentuk pemanggilan ini mengurangi beban pada database dan jaringan.  

Contoh perintah 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’);

Memperbarui indeks

Setelah anggota dan koordinatnya dicatat di indeks, Redis memungkinkan Anda memperbarui lokasi anggota itu. Memperbarui anggota dalam Kumpulan Geografis dilakukan dengan memanggil perintah yang sama yang digunakan untuk menambahkan mereka, yaitu GEOADD. Saat dipanggil dengan anggota yang sudah ada, GEOADDcukup perbarui data spasial yang terkait dengan setiap anggota dengan nilai baru. Oleh karena itu, begitu Romeo keluar rumah untuk memulai jalan-jalan malamnya, lokasinya yang diperbarui dapat dicatat sebagai berikut.

Contoh perintah Redis:

GEOADD locations 10.999216 45.4432923 Romeo

Contoh Node Redis:

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

Menghapus anggota dari indeks

Setelah ditambahkan ke indeks, anggota mungkin perlu dihapus darinya di lain waktu. Untuk memfasilitasi penghapusan anggota dari Geo Set, Redis menyediakan ZREMperintah. Untuk menghapus anggota (atau anggota) dari himpunan, ZREMdipanggil dengan nama kunci yang sesuai diikuti oleh anggota yang akan dihapus darinya.

Contoh perintah Redis:

ZREM locations Mercutio

Contoh Node Redis:

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

Indeks geospasial dapat dihapus seluruhnya. Karena indeks disimpan sebagai kunci Redis, DELperintah dapat digunakan untuk menghapusnya.

Membaca dari indeks

Data dalam indeks Kumpulan Geografis dapat dibaca dengan beberapa cara. Pertama, indeks dapat digunakan untuk memindai semua anggota di dalamnya, baik dalam satu kelompok besar atau dalam beberapa potongan kecil. Redis menyediakan dua perintah yang dapat digunakan untuk melakukan iterasi ke seluruh indeks: ZRANGEdan ZSCAN. Namun, karena ini dapat digunakan untuk mencakup semua elemen yang diindeks, jenis akses ke data ini sebagian besar disediakan untuk operasi offline dan nonkritis (misalnya, ETL dan proses pelaporan).

Jenis kedua dari akses baca ke indeks adalah untuk mengambil koordinat anggota, dan untuk mencapai itu Redis menyediakan dua perintah. Yang pertama dari perintah ini adalah GEOPOS, yang mengembalikan koordinat untuk anggota tertentu dalam Kumpulan Geografis. Dengan asumsi bahwa Romeo menjaga jalannya, jawaban mengenai keberadaannya saat ini disediakan dengan mengeksekusi yang berikut ini.

Contoh perintah Redis:

GEOPOS locations Romeo

1)     1) 10.999164

       2) 45.442681 

Contoh Node Redis:

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

});

Pada contoh di atas, baris pertama adalah kueri, sedangkan baris berikut adalah respons database. Redis menyediakan perintah lain yang disebut GEOHASHyang melaporkan lokasi anggota. Meskipun keduanya secara praktis menjalankan fungsi yang sama, perbedaan di antara keduanya adalah bahwa keluaran dari GEOHASHdikodekan sebagai geohash standar (lebih lanjut tentang geohash di bawah).

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

Mencari indeks

Jenis akses baca terakhir dan mungkin paling berguna yang dimungkinkan oleh indeks geospasial adalah mencari data berdasarkan lokasinya. Contoh paling umum dari pencarian semacam itu adalah menemukan anggota yang diindeks dalam jarak tertentu dari lokasi tertentu. Untuk tujuan itu, Redis memberikan GEORADIUSperintah.

Seperti namanya, GEORADIUSmelakukan pencarian dalam lingkaran yang diberikan oleh pusat dan jari-jarinya dan mengembalikan anggota yang termasuk di dalamnya. Perintah Redis lainnya GEORADIUSBYMEMBER,, melayani tujuan yang sama tetapi menerima salah satu anggota yang diindeks sebagai pusat lingkaran. Berikut adalah contoh pencarian tersebut.

Contoh perintah Redis:

GEORADIUSBYMEMBER locations Romeo 100 m

1) “Juliet”

Contoh Node Redis:

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

});

Perintah pencarian juga mendukung pengurutan balasan dari terdekat ke terjauh (default) atau sebaliknya, serta mengembalikan lokasi dan jarak setiap balasan. Redis juga memungkinkan penyimpanan balasan di Set lain untuk diproses lebih lanjut (seperti operasi paging dan Set).

Redis untuk data geospasial

Kesederhanaan penerapan fungsionalitas berbasis lokasi di Redis berarti Anda tidak hanya dapat menangani banjir geodata dengan mudah, tetapi juga menerapkan kecerdasan di atas pemrosesan sederhana. Misalnya, kueri radius bawaan dapat membantu Anda menerapkan fungsi sederhana seperti "item terdekat yang menarik" tanpa membanjiri pengguna atau aplikasi Anda dengan terlalu banyak pilihan. Operasi set persimpangan dapat membantu Anda mengisolasi "item yang diminati" berdasarkan beberapa filter seperti lokasi geografis, karakteristik pengguna, dan preferensi.

Manfaat lain dalam efisiensi diperoleh dari cara set Redis Geo diimplementasikan. Kumpulan Geografis di Redis hanyalah versi lain dari Kumpulan Terurut yang canggih, dengan perbedaan utama yaitu Kumpulan Geografis menggunakan geohashbujur dan lintang lokasi sebagai skornya (ditambah pengodean dan penguraian singkat yang transparan bagi pengguna). Geohashing, sistem yang ditemukan oleh Gustavo Niemeyer, juga memungkinkan pencarian dengan sangat efisien. Seluruh kumpulan koordinat lokasi tidak perlu dibandingkan setiap jarak waktu dihitung; representasi tersebut memastikan bahwa pencarian dapat dibatasi dengan mudah dan karena itu menjadi efisien ruang dan waktu.

Perpustakaan lain yang tersedia menambahkan kemampuan menarik, seperti memasukkan ketinggian dalam penghitungan. Misalnya, Anda mungkin melacak drone atau sekelompok drone di ketinggian yang berbeda, membawa sensor yang mengukur kondisi angin atau perbedaan suhu di suatu lokasi. Kombinasi yang diperlukan dari Sets dan Sorted Sets tersedia di xyzsets API ini di library Geo Lua yang tersedia di GitHub.

Penghitungan panjang jalur, biasanya diperlukan untuk menavigasi antara titik jalan ke tujuan tertentu, dapat dengan mudah dilakukan dengan API geopathlen. Pelacakan waktu nyata mudah diterapkan dengan API pembaruan lokasi ini.

Jika aplikasi Anda menggunakan data lokasi dengan cara apa pun, pertimbangkan untuk melepaskan banyak kerja keras ke Redis. Untuk kumpulan data yang sangat besar, mungkin lebih hemat biaya menggunakan Redis pada Flash, yang menggunakan kombinasi RAM dan memori flash untuk memberikan karakteristik throughput ekstrim dan latensi submillisecond dari Redis. Untuk detail teknis lebih lanjut tentang menggunakan Redis untuk data geospasial, termasuk pencarian geohash dan kapabilitas lanjutan dengan Lua, lihat whitepaper Redis untuk Data Geospasial.

Itamar Haber adalah kepala advokat pengembang untuk Redis Labs.

Forum Teknologi Baru menyediakan tempat untuk mengeksplorasi dan mendiskusikan teknologi perusahaan yang sedang berkembang secara mendalam dan luas. Pemilihannya subjektif, berdasarkan pilihan teknologi yang kami yakini penting dan paling menarik bagi pembaca. tidak menerima jaminan pemasaran untuk publikasi dan berhak untuk mengedit semua konten yang dikontribusikan. Kirim semua pertanyaan ke [email protected]