Jadual Kandungan
Pengkomputeran dengan pangkalan data
Algoritma GEO
Arahan Redis GEO
Rumah pangkalan data Redis Mari bercakap tentang modul lokasi geografi GEO di Redis

Mari bercakap tentang modul lokasi geografi GEO di Redis

Dec 28, 2021 am 10:10 AM
geo redis

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
Salin selepas log masuk

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 ...]
Salin selepas log masuk
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
Salin selepas log masuk

Padamkan zrem menggunakan zset dan anda boleh

2 Geodist jarak

geodist key member1 member2 [unit]
Salin selepas log masuk
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"
Salin selepas log masuk

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 ...]
Salin selepas log masuk
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"
Salin selepas log masuk

4 >

geohash key member [member ...]
Salin selepas log masuk
Pengekodan rentetan latitud dan longitud ialah pengekodan
127.0.0.1:6379> geohash beijing gugong
1) "wx4g0gfwqk0"
Salin selepas log masuk
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"
Salin selepas log masuk
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]
Salin selepas log masuk
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"
Salin selepas log masuk

 georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]
Salin selepas log masuk
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"
Salin selepas log masuk
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 Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penyelesaian kepada ralat 0x80242008 semasa memasang Windows 11 10.0.22000.100 Penyelesaian kepada ralat 0x80242008 semasa memasang Windows 11 10.0.22000.100 May 08, 2024 pm 03:50 PM

Penyelesaian kepada ralat 0x80242008 semasa memasang Windows 11 10.0.22000.100

Bagaimana untuk menukar kata laluan dalam redis Bagaimana untuk menukar kata laluan dalam redis Apr 20, 2024 am 03:00 AM

Bagaimana untuk menukar kata laluan dalam redis

Menganalisis kesesakan fungsi PHP dan meningkatkan kecekapan pelaksanaan Menganalisis kesesakan fungsi PHP dan meningkatkan kecekapan pelaksanaan Apr 23, 2024 pm 03:42 PM

Menganalisis kesesakan fungsi PHP dan meningkatkan kecekapan pelaksanaan

Adakah redis cache memori? Adakah redis cache memori? Apr 20, 2024 am 05:26 AM

Adakah redis cache memori?

Strategi dan pengoptimuman caching API Golang Strategi dan pengoptimuman caching API Golang May 07, 2024 pm 02:12 PM

Strategi dan pengoptimuman caching API Golang

Adakah redis pangkalan data bukan hubungan? Adakah redis pangkalan data bukan hubungan? Apr 20, 2024 am 05:36 AM

Adakah redis pangkalan data bukan hubungan?

Mekanisme caching dan amalan aplikasi dalam pembangunan PHP Mekanisme caching dan amalan aplikasi dalam pembangunan PHP May 09, 2024 pm 01:30 PM

Mekanisme caching dan amalan aplikasi dalam pembangunan PHP

Yang manakah mempunyai prestasi yang lebih baik, erlang atau golang? Yang manakah mempunyai prestasi yang lebih baik, erlang atau golang? Apr 21, 2024 am 03:24 AM

Yang manakah mempunyai prestasi yang lebih baik, erlang atau golang?

See all articles