12.Geospatial
12.1 簡介
基于位置信息服務(Location-Based Service,LBS)的應用。Redis3.2版本后增加了對GEO類型的支持。主要來維護元素的經緯度。redis基于這種類型,提供了經緯度設置、查詢、范圍查詢、距離查詢、經緯度hash等一些相關操作
12.2 GEO底層結構
- 約車系統,針對每一輛車,有一個唯一編號,車輛有行駛的經緯度
- 呼叫車輛,會暴露用戶的經緯度,根據經緯度進行范圍查找,進行匹配
- 把附近車輛找到后,車輛信息獲取,將信息反饋給用戶
第一種方式,可以使用hash來存儲,但hash沒有排序功能
第二種方式,geo底層結束 zset 來實現。需要將經緯度放在一起,生成一個權重的分數,按這個分數進行排序
GEOHash編碼:
編碼的過程:
- 經度-180,180之間,按給定位數做N次二分區操作。
-
例如,N=5,做5次二分區操作,例如,坐標116.40
-
對經度進行編碼 116.40
次數 最小 中間 最大 區間 編碼 1 -180 0 180 [0,180] 1 2 0 90 180 [90,180] 1 3 90 135 180 [90,135] 0 4 90 112.5 135 [112.5,135] 1 5 112.5 123.75 135 [112.5,123.75] 0 11010
-
對緯度進行編碼 39.96
次數 最小 中間 最大 區間 編碼 1 -90 0 90 [0,90] 1 2 0 45 90 [0,45] 0 3 0 22.5 45 [22.5,45] 1 4 22.5 33.75 45 [33.75,45] 1 5 33.75 39.75 45 [39.375,45] 1 10111
-
經度:11010
緯度:10111
最后合成的編碼:1110011101
12.3 GEO操作指令
geoadd < key> < longitude>< latitude>< member> [longitude latitude member…]:添加地理位置
(key 經度 緯度 位置名稱)
geopos < key>< member>[member…]:獲取指定的位置坐標值
geodist < key>< member1>< member2>:獲取兩個位置之間的直線距離。單位:m 米 km 千米 ft英尺 mi英里
georadius < key>< longitude> < latitue> radius [m | km| fm| mi],以經定的經緯度做為中心,找出
給定半徑內的位置
12.4 查找附近的人案例
geoadd nearby 116.511023 39.945711 person1 116.508257 39.946735 person2 116.513395
39.948035 person3 116.51415 39.945131 person4 116.508724 39.943194 person5 116.511526
39.943775 person6 116.509802 39.94419 person7 116.512317 39.946928 person8 116.505166
39.946265 person9 116.506316 39.946375 person10
georadius nearby 116.506316 39.946375 500 m desc count 10 倒序附近500米的前10個