微信之前有個功能,叫附近的人,可以搜索自己的微信用戶。出門掃碼買奶茶時,如果使用手機支付,可以很快速的定位到距離最近的一家店,然后方便的完成下單、支付。這些技術(shù)的背后,是使用經(jīng)緯度坐標(biāo)來定位位置,以某個點為圓心,搜索指定半徑圓周內(nèi)其他的位置點來實現(xiàn)的。
雖然可以大致明白背后的邏輯,但是要想自己實現(xiàn)相應(yīng)的功能,還是有一定難度的,還好redis已經(jīng)為我們提供了這種能力。
Redis的GEO數(shù)據(jù)類型
Redis3.2版本之后,增加了GEO數(shù)據(jù)類型,用于存儲和查詢地理位置。
對GEO的操作命令,主要為以下6個:
- geoadd:添加地理位置(支持多個)
geoadd key longitude latitude member [longitude latitude member ...]
- geopos:查詢地理位置的坐標(biāo)(支持多個)
geopos key member [member ...]
- geodist:計算兩點之間的距離
geodist key member1 member2 [unit]
- georadius:查詢某位置內(nèi)其他成員信息
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)新院和科學(xué)島的距離
127.0.0.1:6379[9]> geodist address chuangxinyuan kexuedao
"10027.0847"
// 計算創(chuàng)新院和科學(xué)島的距離,以km為單位
127.0.0.1:6379[9]> geodist address chuangxinyuan kexuedao km
"10.0271"
// 查詢以創(chuàng)新院為圓心,半徑15公里內(nèi)所有位置(117.128531 31.828228是創(chuàng)新院的經(jī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公里內(nèi)的所有位置,查出位置的經(jīng)緯度坐標(biāo),距離圓心的公里數(shù)
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公里內(nèi)的所有位置,查出位置的經(jīng)緯度坐標(biāo),距離圓心的公里數(shù),按距離排序取前兩個
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
應(yīng)用場景
-可以查詢附近的人,可以查詢附件的店鋪
-可以計算兩點之間的直線距離(異地戀可以試一下)