最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小采 时间:2020-11-09 06:53:28
文档

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

使用Redis完成微信摇一摇功能:Redis提供了地理位置信息(GEO)功能,有了他就可以完成附近的人、摇一摇等功能。首先,介绍下GEO的相关API。GEO API添加地址位置信息geoadd key longitude latitude member [longitude latitude member ...]longitude :经度
推荐度:
导读使用Redis完成微信摇一摇功能:Redis提供了地理位置信息(GEO)功能,有了他就可以完成附近的人、摇一摇等功能。首先,介绍下GEO的相关API。GEO API添加地址位置信息geoadd key longitude latitude member [longitude latitude member ...]longitude :经度

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

GEO API

添加地址位置信息

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

  • longitude :经度

  • latitude :纬度

  • member :成员

  • 该命令可以一次添加一个或多个成员

    有一些用户,都在合肥,现在把他们的地理坐标都存放在Redis里。

  • 小A在家里看电视,他家的坐标为:117.230279,31.81676

  • 小B在公司加班,公司的坐标为:117.229704,31.824676

  • 小C在出差,他出差的地址坐标为:117.300419,31.696095

  • 小D在家带娃,他家的地址坐标为:117.192909,31.732465

  • 小E还在上学,他学校地址坐标为: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

    获取两个地点的距离

    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"

    获取指定位置范围内的地理信息位置集合

    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]

    这两个命令相比其他的稍显复杂。我们一起来看看这两个命令。

    这两个命令功能基本相似,主要的区别是,第一个命令给出的是具体的经纬度,而第二个命令则只给出了成员名。比如,我想知道成员离合肥大蜀山的距离,因为大蜀山经纬度信息还没有存放在redis中,所以,我们就需要用第一条命令,将大蜀山的经纬度输入即可。又如,其他成员离小A所在坐标的距离,那么就可以使用第二条命令,直接输入成员小A即可。

    radiusm 及后面的单位是必填信息,指定在半径距离多少范围内搜索。

    合肥大蜀山的坐标是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内。

    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的使用已经成为程序员必备的技能了。

    声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

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

    使用Redis完成微信摇一摇功能:Redis提供了地理位置信息(GEO)功能,有了他就可以完成附近的人、摇一摇等功能。首先,介绍下GEO的相关API。GEO API添加地址位置信息geoadd key longitude latitude member [longitude latitude member ...]longitude :经度
    推荐度:
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top