好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

使用Redis完成微信摇一摇功能

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

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

获取两个地点的距离

geodist key member1 member2 [unit]

unit有四个单位

'm' => 米

'km' => 千米

'mi' => 英里

'ft' => 尺

我们主要会用到米以及千米。

现在我们来看看小A和小B之间的距离

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

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

再来看看小C和小E之间的距离

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

他们之间相差将近19千米。

获取地址位置信息

geopos key member [member ...]

来看下小D的所在地址的经纬度信息

127.0.0.1:6379> geopos location d
1) 1) "117.19290822744369507"
   2) "31.73246441933707018"
# 查看离大蜀山10km的成员有哪些
127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 10 km
1) "e"
2) "a"
3) "b"

可以看到小e、小a及小b离大蜀山比较近,在10km内。

WITHCOORD: 将位置元素的经度和维度也一并返回

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"

可以看到,除了给出了成员外,成员的位置信息页一并给出了

withdist:返回结果中包含离中心节点位置的距离

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:这个命令可以忽略不看,基本用不上

COUNT count:指定返回结果的数量。

asc|desc:返回结果按照离中心节点的距离做升序或者降序。

storedist key:将返回结果离中心节点的距离保存到指定键。

# 获取离大蜀山100km内范围的成员,按距离的升序,只需给出最近的4个成员即可
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"

实战

介绍完了上面知识后,就可以来使用php结合redis完成摇一摇找附近的人的功能了。首先,把成员的位置信息给保存下来。

伪代码如下:

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可以大大方便开发人员,丰富的API可以完成各种各样的需求,Redis的使用已经成为程序员必备的技能了。

以上就是使用Redis完成微信摇一摇功能的详细内容,更多请关注Gxlcms其它相关文章!

查看更多关于使用Redis完成微信摇一摇功能的详细内容...

  阅读:66次