Rumah  >  Artikel  >  pangkalan data  >  Mari bercakap tentang modul lokasi geografi GEO di Redis

Mari bercakap tentang modul lokasi geografi GEO di Redis

青灯夜游
青灯夜游ke hadapan
2021-12-28 10:10:242657semak imbas

GEO ialah modul lokasi geografi baharu yang ditambahkan pada Redis selepas versi 3.2. Artikel ini akan membawa anda melalui modul lokasi geografi GEO saya harap ia akan membantu anda.

Mari bercakap tentang modul lokasi geografi GEO di Redis

GEO ialah modul lokasi geografi baharu yang ditambahkan pada Redis selepas versi 3.2, yang bermaksud bahawa Redis boleh digunakan untuk melaksanakan fungsi lokasi berdekatan. [Cadangan berkaitan: Tutorial video Redis]

Pengkomputeran dengan pangkalan data

Mari bercakap tentang modul lokasi geografi GEO di Redis

Kaedah umum ialah lulus Kawasan segi empat tepat digunakan untuk mengehadkan bilangan elemen, dan kemudian pengiraan jarak penuh dilakukan pada elemen dalam kawasan itu dan kemudian diisih. Ini boleh mengurangkan jumlah pengiraan dengan ketara.

select id from positions where x0-r < x < x0+r and y0-r < y < y0+r

Untuk meningkatkan prestasi, SQL di atas perlu menambah indeks komposit dua hala pada koordinat latitud dan longitud. Walau bagaimanapun, prestasi pertanyaan pangkalan data adalah terhad Jika ia digunakan dalam situasi konkurensi tinggi, ini mungkin bukan penyelesaian yang baik.

Algoritma GEO

  • Algoritma pengisihan jarak geografi yang paling biasa dalam industri ialah algoritma GeoHash dan Redis juga menggunakan algoritma GeoHash.
  • GeoHash Algoritma memetakan data longitud dan latitud dua dimensi kepada integer satu dimensi , supaya semua elemen akan dipasang pada garis, memetakan koordinat dua dimensi rapat Jarak antara titik selepas satu dimensi juga akan menjadi sangat dekat. Apabila kami ingin mengira "orang berdekatan", kami mula-mula memetakan kedudukan sasaran ke garisan ini, dan kemudian memperoleh titik berdekatan pada garisan satu dimensi ini. Pelaksanaan algoritma
  • , ia menganggap seluruh bumi sebagai satah dua dimensi, dan kemudian membahagikannya kepada satu siri grid segi empat sama, sama seperti papan Go. Semua koordinat elemen peta akan diletakkan dalam petak unik. Lebih kecil segi empat sama, lebih tepat koordinat. Kemudian lakukan pengekodan integer pada petak ini, semakin hampir petak itu, semakin dekat pengekodan itu.
  • Selepas pengekodan, koordinat setiap elemen peta akan menjadi integer Koordinat elemen boleh dipulihkan melalui integer ini, semakin kecil kehilangan nilai koordinat yang dipulihkan.
  • GeoHash Algoritma akan terus base32 mengekod integer (0-9,a-z 去掉 a,i,l,o 四个字母) ke dalam rentetan.
  • Dalam Redis, latitud dan longitud dikodkan menggunakan integer 52-bit dan dimasukkan ke dalam zset zset daripada value ialah key elemen dan score ialah 52. daripada GeoHash nilai integer bit.
  • Apabila menggunakan pertanyaan Redis untuk Geo, kita mesti sentiasa ingat bahawa struktur dalamannya sebenarnya hanyalah zset(skiplist). Dengan mengisih zset mengikut score, anda boleh mendapatkan elemen lain berhampiran koordinat (keadaan sebenar adalah lebih rumit, tetapi ini sudah cukup untuk difahami), dan dengan memulihkan score untuk menyelaraskan nilai, anda boleh mendapatkan koordinat asal daripada unsur tersebut.

Arahan Redis GEO

Mari bercakap tentang modul lokasi geografi GEO di Redis

Tambah geoadd

geoadd key longitude latitude member [longitude latitude member ...]
127.0.0.1:6379> geoadd beijing 116.403856 39.924043 gugong
(integer) 1
127.0.0.1:6379> geoadd beijing 116.343620 39.947633 dongwuyuan
(integer) 1
127.0.0.1:6379> geoadd beijing 116.328643 39.900272 xizhan 116.415324 39.931231 meishuguan 116.416852 39.887607 tiantan
(integer) 3

Padamkan zrem menggunakan zset dan anda boleh

2 Geodist jarak

geodist key member1 member2 [unit]
127.0.0.1:6379> geodist beijing gugong xizhan km
"6.9402"
127.0.0.1:6379> geodist beijing gugong dongwuyuan   # 默认单位m
"5768.5737"
127.0.0.1:6379> geodist beijing xizhan xizhan
"0.0000"

Unit jarak boleh menjadi m, km, ml dan kaki, yang masing-masing mewakili meter, kilometer, batu dan kaki.

3. Geopos lokasi

geopos key member [member ...]
127.0.0.1:6379> geopos beijing gugong
1) 1) "116.4038559794426"
   2) "39.92404192186725"
127.0.0.1:6379> geopos beijing tiantan xizhan
1) 1) "116.41685396432877"
   2) "39.887607839922914"
2) 1) "116.32864147424698"
   2) "39.900271306834973"

4 >

geohash key member [member ...]
Pengekodan rentetan latitud dan longitud ialah pengekodan
127.0.0.1:6379> geohash beijing gugong
1) "wx4g0gfwqk0"
Anda boleh mencari terus latitud dan longitud melalui

base32http://geohash.org/wx4g0gfwqk0

5. . Lokasi berdekatan georadiusbymember1. Pertanyaan

dan maksimum

elemen dalam julat ireader kilometer diisih ke hadapan mengikut jarak (menggunakan 20 untuk pengisihan terbalik) 3 desc

2. Tiga parameter pilihan
127.0.0.1:6379> georadiusbymember company ireader 20 km count 3 asc
1) "ireader"
2) "juejin"
3) "meituan"
digunakan untuk membawa parameter tambahan

ia boleh digunakan untuk memaparkan jarak withcoord withdist withhashwithdist

georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]
3. Mengikut koordinat Nilai untuk menanyakan elemen berdekatan
127.0.0.1:6379> georadiusbymember beijing gugong 5 km withcoord withdist withhash count 3 asc
1) 1) "gugong"
   2) "0.0000"
   3) (integer) 4069885568932443
   4) 1) "116.4038559794426"
      2) "39.92404192186725"
2) 1) "meishuguan"
   2) "1.2634"
   3) (integer) 4069885710390435
   4) 1) "116.41532510519028"
      2) "39.93123039107514"
3) 1) "tiantan"
   2) "4.2014"
   3) (integer) 4069885398502557
   4) 1) "116.41685396432877"
      2) "39.887607839922914"

 georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]
127.0.0.1:6379> georadius beijing 116.383882 39.922061 5 km withcoord withdist withhash count 3 asc
1) 1) "gugong"
   2) "1.7180"
   3) (integer) 4069885568932443
   4) 1) "116.4038559794426"
      2) "39.92404192186725"
2) 1) "meishuguan"
   2) "2.8693"
   3) (integer) 4069885710390435
   4) 1) "116.41532510519028"
      2) "39.93123039107514"
3) 1) "dongwuyuan"
   2) "4.4588"
   3) (integer) 4069879836419688
   4) 1) "116.34361892938614"
      2) "39.94763257169722"
Nota

Dalam aplikasi sebenar, mungkin terdapat berjuta-juta dan berjuta-juta data, kami tahu Redis

Letakkan semuanya dalam satu koleksi

. Dalam persekitaran kluster Redis, koleksi mungkin dipindahkan dari satu nod ke nod yang lain Jika data satu Geo terlalu besar, ia akan memberi kesan yang lebih besar pada kerja migrasi kluster. satu zset sepadan dengan Jumlah data tidak boleh melebihi key, jika tidak, ia akan menyebabkan ketinggalan dalam penghijrahan kelompok dan menjejaskan operasi biasa perkhidmatan dalam talian. key

Oleh itu, adalah disyorkan bahawa Geo data digunakan menggunakan tika Redis yang berasingan dan bukannya persekitaran kluster.

Jika jumlah data melebihi 100 juta atau lebih, data Geo perlu dipecah, dipecah mengikut negara, wilayah, bandar, malah di bandar yang sangat ramai penduduk, ia boleh dipecah mengikut daerah. titik. Ini mengurangkan saiz satu koleksi zset dengan ketara.

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Video Pengaturcaraan! !

Atas ialah kandungan terperinci Mari bercakap tentang modul lokasi geografi GEO di Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam