使用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.838297127.0.0.1:6379> geoadd location 117.230279 31.81676 a 117.229704 31.824676 b(integer) 2127.0.0.1:6379> geoadd location 117.300419 31.696095 c(integer) 1127.0.0.1:6379> geoadd location 117.192909 31.732465 d(integer) 1127.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 d1) 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 km1) "e"2) "a"3) "b"可以看到小e、小a及小b离大蜀山比较近,在10km内。
WITHCOORD: 将位置元素的经度和维度也一并返回127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 10 km withcoord1) 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 withdist1) 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 asc1) 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完成微信摇一摇功能的详细内容,更多请关注小潘博客其它相关文章!