Redis geo 我身邊有啥?

我們要做什麼?

          每天你在用美團的時候,查找附近的美食,附近的商家,當你每天用共享單車的時候,有沒有想過查看你附近的共享單車功能是怎麼實現的,對!我們今天分分鐘用redis來實現這個功能,Easy的不行不行的。

怎麼做?

        只講實現不說原理,首先你要在本地有個redis,然後打開客戶端,你把redis想成一個魔法口袋,把所有的地點座標都裝進去,然後,你就可以問諸如,我附近1000米有啥菜館的問題。

先打開redis客戶端

添加一個座標或多個

127.0.0.1:6379> geoadd fanguan 116.48105 39.996794 KFC
(integer) 1
127.0.0.1:6379> geoadd fanguan 116.514203 39.905409 麥當勞
(integer) 1
127.0.0.1:6379> geoadd fanguan 116.489033 40.007669 必勝客
(integer) 1
127.0.0.1:6379> geoadd fanguan 116.562108 39.787602 麻辣誘惑 116.334255 40.027400 火鍋
(integer) 2

geoadd   是命令

fanguan  是key  是飯館的拼音 -  -

116.48105 39.996794 是座標定位

KFC 是飯館的名稱,大家可以存放業務上的主鍵

現在我們已經添加了1個或多個座標,查看下我們添加的座標數據

127.0.0.1:6379> ZRANGE fanguan 0 -1 WITHSCORES
 1) "\xe9\xba\xbb\xe8\xbe\xa3\xe8\xaf\xb1\xe6\x83\x91"
 2) "4069154033428715"
 3) "\xe7\x81\xab\xe9\x94\x85"
 4) "4069880904286516"
 5) "\xe9\xba\xa6\xe5\xbd\x93\xe5\x8a\xb3"
 6) "4069886008361398"
 7) "KFC"
 8) "4069887154388167"
 9) "\xe5\xbf\x85\xe8\x83\x9c\xe5\xae\xa2"
10) "4069887179083478"

哎0 0 除了kfc都是中文亂碼

刪除一個座標的命令

127.0.0.1:6379> zrem fanguan 火鍋
(integer) 1

輸入當前座標,查看附近的餐館

127.0.0.1:6379> georadius fanguan 116.514202 39.905409 20 km withdist count 3 asc
1) 1) "\xe9\xba\xa6\xe5\xbd\x93\xe5\x8a\xb3"
   2) "0.0000"
2) 1) "KFC"
   2) "10.5501"
3) 1) "\xe5\xbf\x85\xe8\x83\x9c\xe5\xae\xa2"
   2) "11.5748"

我哭不應該用中文。。。

fanguan    redis key

然後是座標 ,就可以理解爲我的位置

20 km 是說這個座標20千米之內的點,是範圍

count 3 asc 是排序前3個

還有 asc可以換成desc 變成倒敘

三個可選參數 withcoord withdist withhash 用來攜帶附加參數
 withdist 很有用,它可以用來顯示距離

127.0.0.1:6379> georadiusbymember fanguan KFC 20 km withcoord withdist withhash count 3 asc
1) 1) "KFC"
   2) "0.0000"
   3) (integer) 4069887154388167
   4) 1) "116.48104995489120483"
      2) "39.99679348858259686"
2) 1) "\xe5\xbf\x85\xe8\x83\x9c\xe5\xae\xa2"
   2) "1.3878"
   3) (integer) 4069887179083478
   4) 1) "116.48903220891952515"
      2) "40.00766997707732031"
3) 1) "\xe9\xba\xa6\xe5\xbd\x93\xe5\x8a\xb3"
   2) "10.5501"
   3) (integer) 4069886008361398
   4) 1) "116.5142020583152771"
      2) "39.90540918662494363"

其他命令

算2個點距離

127.0.0.1:6379> geodist fanguan KFC 必勝客 km
"1.3878"

距離單位可以是 m、km、 ml、ft,分別代表米、千米、英里和尺。

獲取元素位置

geopos 指令可以獲取集合中任意元素的經緯度座標,可以一次獲取多個。

127.0.0.1:6379> geopos fanguan KFC 必勝客
1) 1) "116.48104995489120483"
   2) "39.99679348858259686"
2) 1) "116.48903220891952515"
   2) "40.00766997707732031"

獲取元素hash值(geo hash)

127.0.0.1:6379> geohash fanguan KFC
1) "wx4gd94yjn0"

總結

           之前寫過一個關於算附近的代碼,那個是用java自己實現的,還是有漏洞的,不過這次發現redis已經有了這個實現,簡直是簡單的不得了,不過要注意的是,經緯度存入後,讀取的時候有一些小誤差,但是不耽誤這個算法和功能的實現。

 

 

 

——————————————————————————chenchen————————————————————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章