Redis制作微信搖一搖功能-創(chuàng)新互聯(lián)

Redis提供了地理位置信息(GEO)功能,有了他就可以完成附近的人、搖一搖等功能。首先,介紹下GEO的相關(guān)API。

創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元泰安做網(wǎng)站,已為上家服務(wù),為泰安各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575

GEO API

添加地址位置信息

geoadd key longitude latitude member [longitude latitude member ...]

  • longitude :經(jīng)度

  • latitude :緯度

  • member :成員

該命令可以一次添加一個(gè)或多個(gè)成員

有一些用戶,都在合肥,現(xiàn)在把他們的地理坐標(biāo)都存放在Redis里。

  • 小A在家里看電視,他家的坐標(biāo)為:117.230279,31.81676

  • 小B在公司加班,公司的坐標(biāo)為:117.229704,31.824676

  • 小C在出差,他出差的地址坐標(biāo)為:117.300419,31.696095

  • 小D在家?guī)?,他家的地址坐?biāo)為:117.192909,31.732465

  • 小E還在上學(xué),他學(xué)校地址坐標(biāo)為:117.189604,31.838297

127.0.0.1:6379> geoadd location 117.230279 31.81676 a 117.229704 31.824676 b
(integer) 2
127.0.0.1:6379> geoadd location 117.300419 31.696095 c
(integer) 1
127.0.0.1:6379> geoadd location 117.192909 31.732465 d
(integer) 1
127.0.0.1:6379> geoadd location 117.189604 31.838297 e
(integer) 1

獲取兩個(gè)地點(diǎn)的距離

geodist key member1 member2 [unit]

unit有四個(gè)單位

  • 'm' => 米

  • 'km' => 千米

  • 'mi' => 英里

  • 'ft' => 尺

我們主要會(huì)用到米以及千米。

現(xiàn)在我們來(lái)看看小A和小B之間的距離

127.0.0.1:6379> GEODIST location a b km
"0.8821"

可以看到小A和小B之間有0.88千米

再來(lái)看看小C和小E之間的距離

127.0.0.1:6379> GEODIST location c e km
"18.9728"

他們之間相差將近19千米。

獲取地址位置信息

geopos key member [member ...]

來(lái)看下小D的所在地址的經(jīng)緯度信息

127.0.0.1:6379> geopos location d
1) 1) "117.19290822744369507"
   2) "31.73246441933707018"

獲取指定位置范圍內(nèi)的地理信息位置集合

georadius key longitude latitude radiusm km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key] georadiusbymember key member radiusm km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]

這兩個(gè)命令相比其他的稍顯復(fù)雜。我們一起來(lái)看看這兩個(gè)命令。

這兩個(gè)命令功能基本相似,主要的區(qū)別是,第一個(gè)命令給出的是具體的經(jīng)緯度,而第二個(gè)命令則只給出了成員名。比如,我想知道成員離合肥大蜀山的距離,因?yàn)榇笫裆浇?jīng)緯度信息還沒有存放在redis中,所以,我們就需要用第一條命令,將大蜀山的經(jīng)緯度輸入即可。又如,其他成員離小A所在坐標(biāo)的距離,那么就可以使用第二條命令,直接輸入成員小A即可。

radiusm 及后面的單位是必填信息,指定在半徑距離多少范圍內(nèi)搜索。

合肥大蜀山的坐標(biāo)是117.175571,31.846746

# 查看離大蜀山10km的成員有哪些
127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 10 km
1) "e"
2) "a"
3) "b"

可以看到小e、小a及小b離大蜀山比較近,在10km內(nèi)。

WITHCOORD: 將位置元素的經(jīng)度和維度也一并返回

127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 10 km withcoord
1) 1) "e"
   2) 1) "117.18960374593734741"
      2) "31.83829663190295634"
2) 1) "a"
   2) 1) "117.23027676343917847"
      2) "31.81675910621205361"
3) 1) "b"
   2) 1) "117.22970277070999146"
      2) "31.8246750403926697"

可以看到,除了給出了成員外,成員的位置信息頁(yè)一并給出了

withdist:返回結(jié)果中包含離中心節(jié)點(diǎn)位置的距離

127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 10 km withcoord withdist
1) 1) "e"
   2) "1.6252"
   3) 1) "117.18960374593734741"
      2) "31.83829663190295634"
2) 1) "a"
   2) "6.1522"
   3) 1) "117.23027676343917847"
      2) "31.81675910621205361"
3) 1) "b"
   2) "5.6737"
   3) 1) "117.22970277070999146"
      2) "31.8246750403926697"

可以看到小E離大蜀山1.62千米,小A離大蜀山6.15千米,小B離大蜀山5.67千米。

withhash:這個(gè)命令可以忽略不看,基本用不上

COUNT count:指定返回結(jié)果的數(shù)量。

asc|desc:返回結(jié)果按照離中心節(jié)點(diǎn)的距離做升序或者降序。

storedist key:將返回結(jié)果離中心節(jié)點(diǎn)的距離保存到指定鍵。

# 獲取離大蜀山100km內(nèi)范圍的成員,按距離的升序,只需給出最近的4個(gè)成員即可
127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 100 km withdist count 4 asc
1) 1) "e"
   2) "1.6252"
2) 1) "b"
   2) "5.6737"
3) 1) "a"
   2) "6.1522"
4) 1) "d"
   2) "12.8164"

實(shí)戰(zhàn)

介紹完了上面知識(shí)后,就可以來(lái)使用php結(jié)合redis完成搖一搖找附近的人的功能了。首先,把成員的位置信息給保存下來(lái)。

偽代碼如下:

function addLocation ($key,$member, $lng, $lat)
{
    $redis->geoadd($key, $lng, $lat, $member);
}

然后,獲取附近的人的信息

function near (
    $key, 
    $member, 
    $radius, 
    $unit = 'km', 
    $count = 0,  
    $withDist = false, 
    $withcoord = false, 
    $orderby = 'ASC'
)
{
    $redis = new Redis();
    $redis->connect('localhost', 6379);
    $options = [$orderby];
    if ($count > 0) {
        $options['count'] = $count;
    }
    if ($withDist) {
        $options[] = 'WITHDIST';
    }
    if ($withcoord) {
        $options[] = 'WITHCOORD';
    }
    $result = $redis->geoRadiusByMember($key, $member, $radius, $unit, $options);
    return $result;
}

以上就是使用Redis完成微信搖一搖功能的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!

分享題目:Redis制作微信搖一搖功能-創(chuàng)新互聯(lián)
文章位置:http://bm7419.com/article34/cdegpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站、品牌網(wǎng)站制作、建站公司、品牌網(wǎng)站設(shè)計(jì)、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司