Mari bercakap tentang modul lokasi geografi GEO di Redis
Dec 28, 2021 am 10:10 AMGEO 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.
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
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 algoritmaGeoHash
. 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 terusbase32
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
daripadavalue
ialahkey
elemen danscore
ialah 52. daripadaGeoHash
nilai integer bit. - Apabila menggunakan pertanyaan Redis untuk Geo, kita mesti sentiasa ingat bahawa struktur dalamannya sebenarnya hanyalah
zset(skiplist)
. Dengan mengisihzset
mengikutscore
, anda boleh mendapatkan elemen lain berhampiran koordinat (keadaan sebenar adalah lebih rumit, tetapi ini sudah cukup untuk difahami), dan dengan memulihkanscore
untuk menyelaraskan nilai, anda boleh mendapatkan koordinat asal daripada unsur tersebut.
Arahan Redis GEO
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 ...]
127.0.0.1:6379> geohash beijing gugong 1) "wx4g0gfwqk0"
base32
http://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
127.0.0.1:6379> georadiusbymember company ireader 20 km count 3 asc 1) "ireader" 2) "juejin" 3) "meituan"
ia boleh digunakan untuk memaparkan jarak withcoord withdist withhash
withdist
georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]
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"
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!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Penyelesaian kepada ralat 0x80242008 semasa memasang Windows 11 10.0.22000.100

Bagaimana untuk menukar kata laluan dalam redis

Menganalisis kesesakan fungsi PHP dan meningkatkan kecekapan pelaksanaan

Strategi dan pengoptimuman caching API Golang

Adakah redis pangkalan data bukan hubungan?

Mekanisme caching dan amalan aplikasi dalam pembangunan PHP

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