我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis制作微信摇一摇功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis制作微信摇一摇功能

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完成微信摇一摇功能的详细内容,更多请关注亿速云其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis制作微信摇一摇功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android利用传感器仿微信摇一摇功能

传感器简单的介绍一下传感器: 就是设备用来感知周边环境变化的硬件。Android中的传感器包含在传感器框架中,属于android.hardware.*(硬件部分)传感器框架主要包含四个部分:① SensorManager:用来获取传感器的入
2023-05-31

Android 微信摇一摇功能实现详细介绍

Android 微信摇一摇功能实现,最近学习传感器,就想实现摇一摇的功能,上网查了些资料,就整理下。如有错误,还请指正。 开发环境Android Studio 2.2.1JDK1.7API 24Gradle 2.2.1 相关知识点加速度传感
2022-06-06

Android利用传感器实现微信摇一摇功能

本文实例为大家分享了Android微信摇一摇功能的实现方法,供大家参考,具体内容如下import java.util.ArrayList; import java.util.List; import java.util.Random
2022-06-06

android 类似微信的摇一摇功能实现思路及代码

代码如下: package com.eboy.testyaoyiyao; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activi
2022-06-06

如何使用PHP实现微信小程序的头像制作功能?

如何使用PHP实现微信小程序的头像制作功能?微信小程序作为一种新型的移动应用形式,受到了越来越多开发者的关注和喜爱。其中,头像制作功能是小程序中常见的一种功能,可以让用户通过选择不同的头像框或者添加自己喜欢的元素来制作个性化的头像。实现头像
2023-10-26

如何使用PHP开发微信小程序的动画制作功能?

如何使用PHP开发微信小程序的动画制作功能?随着微信小程序的发展,越来越多的开发者开始关注和学习微信小程序的开发。其中,动画制作功能是微信小程序中非常重要的一个特性。它能够帮助开发者为小程序添加生动、炫酷的动画效果,提升用户体验。在本文中,
2023-10-27

微信小程序如何实现文字长按复制与一键复制功能

本篇内容介绍了“微信小程序如何实现文字长按复制与一键复制功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、不引入外部组件的实现方式
2023-07-05

微信小程序实现文字长按复制与一键复制功能全过程

微信小程序开发是依托微信的,所以他的代码是嵌入在微信的原始代码之中的,这篇文章主要给大家介绍了关于微信小程序实现文字长按复制与一键复制功能的相关资料,需要的朋友可以参考下
2023-03-19

编程热搜

目录