微信之前有個功能墓塌,叫附近的人,可以搜索自己的微信用戶奥额。出門掃碼買奶茶時苫幢,如果使用手機支付,可以很快速的定位到距離最近的一家店披坏,然后方便的完成下單态坦、支付。這些技術的背后棒拂,是使用經緯度坐標來定位位置伞梯,以某個點為圓心,搜索指定半徑圓周內其他的位置點來實現(xiàn)的帚屉。
雖然可以大致明白背后的邏輯谜诫,但是要想自己實現(xiàn)相應的功能,還是有一定難度的攻旦,還好redis已經為我們提供了這種能力喻旷。
Redis的GEO數據類型
Redis3.2版本之后,增加了GEO數據類型牢屋,用于存儲和查詢地理位置且预。
對GEO的操作命令槽袄,主要為以下6個:
- geoadd:添加地理位置(支持多個)
geoadd key longitude latitude member [longitude latitude member ...]
- geopos:查詢地理位置的坐標(支持多個)
geopos key member [member ...]
- geodist:計算兩點之間的距離
geodist key member1 member2 [unit]
- georadius:查詢某位置內其他成員信息
georadius key longitude latitude radius m|
- geohash:查詢某個或多個位置的hash值
geohash key member [member ...]
- zrem:刪除某個或多個位置
zrem key member [member ...]
操作實戰(zhàn)示例:
// 添加多個位置
127.0.0.1:6379[9]> geoadd address 117.128531 31.828228 chuangxinyuan 117.129016 31.825252 shenggu 117.175853 31.908925 kexuedao 117.14373 31.839379 chanyeyuan
(integer) 4
// 查詢創(chuàng)新院位置
127.0.0.1:6379[9]> geopos address chuangxinyuan
1) 1) "117.12852984666824341"
2) "31.82822871945806043"
// 計算創(chuàng)新院和科學島的距離
127.0.0.1:6379[9]> geodist address chuangxinyuan kexuedao
"10027.0847"
// 計算創(chuàng)新院和科學島的距離,以km為單位
127.0.0.1:6379[9]> geodist address chuangxinyuan kexuedao km
"10.0271"
// 查詢以創(chuàng)新院為圓心锋谐,半徑15公里內所有位置(117.128531 31.828228是創(chuàng)新院的經緯度)
127.0.0.1:6379[9]> georadius address 117.128531 31.828228 15 km
1) "shenggu"
2) "chuangxinyuan"
3) "chanyeyuan"
4) "kexuedao"
// 查詢創(chuàng)新院為圓心遍尺,半徑15公里內的所有位置,查出位置的經緯度坐標涮拗,距離圓心的公里數
127.0.0.1:6379[9]> georadius address 117.128531 31.828228 15 km WITHCOORD WITHDIST
1) 1) "shenggu"
2) "0.3341"
3) 1) "117.12901800870895386"
2) "31.82525295681698907"
2) 1) "chuangxinyuan"
2) "0.0001"
3) 1) "117.12852984666824341"
2) "31.82822871945806043"
3) 1) "chanyeyuan"
2) "1.8978"
3) 1) "117.14373260736465454"
2) "31.83937895783798666"
4) 1) "kexuedao"
2) "10.0271"
3) 1) "117.17585474252700806"
2) "31.90892410228676823"
// 查詢創(chuàng)新院為圓心乾戏,半徑15公里內的所有位置,查出位置的經緯度坐標三热,距離圓心的公里數鼓择,按距離排序取前兩個
127.0.0.1:6379[9]> georadius address 117.128531 31.828228 15 km WITHCOORD WITHDIST COUNT 2 ASC
1) 1) "chuangxinyuan"
2) "0.0001"
3) 1) "117.12852984666824341"
2) "31.82822871945806043"
2) 1) "shenggu"
2) "0.3341"
3) 1) "117.12901800870895386"
2) "31.82525295681698907"
// 查詢聲谷的hash值
127.0.0.1:6379[9]> geohash address shenggu
1) "wtem13dexc0"
// 刪除聲谷的位置
127.0.0.1:6379[9]> zrem address shenggu
(integer) 1
應用場景
-可以查詢附近的人,可以查詢附件的店鋪
-可以計算兩點之間的直線距離(異地戀可以試一下)