本文摘自PHP中文网,作者齐天大圣,侵删。
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
1 2 3 4 5 6 7 8 |
|
获取两个地点的距离
geodist key member1 member2 [unit]
unit有四个单位
'm' => 米
'km' => 千米
'mi' => 英里
'ft' => 尺
我们主要会用到米以及千米。
现在我们来看看小A和小B之间的距离
1 2 |
|
可以看到小A和小B之间有0.88千米
再来看看小C和小E之间的距离
1 2 |
|
他们之间相差将近19千米。
获取地址位置信息
geopos key member [member ...]
来看下小D的所在地址的经纬度信息
1 2 3 |
|
获取指定位置范围内的地理信息位置集合
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
1 2 3 4 5 |
|
可以看到小e、小a及小b离大蜀山比较近,在10km内。
WITHCOORD: 将位置元素的经度和维度也一并返回
1 2 3 4 5 6 7 8 9 10 |
|
可以看到,除了给出了成员外,成员的位置信息页一并给出了
withdist:返回结果中包含离中心节点位置的距离
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
可以看到小E离大蜀山1.62千米,小A离大蜀山6.15千米,小B离大蜀山5.67千米。
withhash:这个命令可以忽略不看,基本用不上
COUNT count:指定返回结果的数量。
asc|desc:返回结果按照离中心节点的距离做升序或者降序。
storedist key:将返回结果离中心节点的距离保存到指定键。
1 2 3 4 5 6 7 8 9 10 |
|
实战
介绍完了上面知识后,就可以来使用php结合redis完成摇一摇找附近的人的功能了。首先,把成员的位置信息给保存下来。
伪代码如下:
1 2 3 4 |
|
然后,获取附近的人的信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
使用redis可以大大方便开发人员,丰富的API可以完成各种各样的需求,Redis的使用已经成为程序员必备的技能了。
以上就是使用Redis完成微信摇一摇功能的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
更多相关阅读请进入《Redis》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。