Rumah > Artikel > pangkalan data > Mari bercakap tentang modul lokasi geografi GEO di 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.
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]
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.
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 GeoHash
Algoritma akan terus base32
mengekod integer (0-9,a-z 去掉 a,i,l,o 四个字母)
ke dalam rentetan. zset
zset
daripada value
ialah key
elemen dan score
ialah 52. daripada GeoHash
nilai integer bit. 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. 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
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"digunakan untuk membawa parameter tambahan
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]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 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!