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的使用已经成为程序员必备的技能了。
以上是使用Redis完成微信摇一摇功能的详细内容。更多信息请关注PHP中文网其他相关文章!

Redis与其他数据库相比,具有以下独特优势:1)速度极快,读写操作通常在微秒级别;2)支持丰富的数据结构和操作;3)灵活的使用场景,如缓存、计数器和发布订阅。选择Redis还是其他数据库需根据具体需求和场景,Redis在高性能、低延迟应用中表现出色。

Redis在数据存储和管理中扮演着关键角色,通过其多种数据结构和持久化机制成为现代应用的核心。1)Redis支持字符串、列表、集合、有序集合和哈希表等数据结构,适用于缓存和复杂业务逻辑。2)通过RDB和AOF两种持久化方式,Redis确保数据的可靠存储和快速恢复。

Redis是一种NoSQL数据库,适用于大规模数据的高效存储和访问。1.Redis是开源的内存数据结构存储系统,支持多种数据结构。2.它提供极快的读写速度,适合缓存、会话管理等。3.Redis支持持久化,通过RDB和AOF方式确保数据安全。4.使用示例包括基本的键值对操作和高级的集合去重功能。5.常见错误包括连接问题、数据类型不匹配和内存溢出,需注意调试。6.性能优化建议包括选择合适的数据结构和设置内存淘汰策略。

Redis在现实世界中的应用包括:1.作为缓存系统加速数据库查询,2.存储Web应用的会话数据,3.实现实时排行榜,4.作为消息队列简化消息传递。Redis的多功能性和高性能使其在这些场景中大放异彩。

Redis脱颖而出是因为其高速、多功能性和丰富的数据结构。1)Redis支持字符串、列表、集合、散列和有序集合等数据结构。2)它通过内存存储数据,支持RDB和AOF持久化。3)从Redis6.0开始引入多线程处理I/O操作,提升了高并发场景下的性能。

RedisisclassifiedasaNoSQLdatabasebecauseitusesakey-valuedatamodelinsteadofthetraditionalrelationaldatabasemodel.Itoffersspeedandflexibility,makingitidealforreal-timeapplicationsandcaching,butitmaynotbesuitableforscenariosrequiringstrictdataintegrityo

Redis通过缓存数据、实现分布式锁和数据持久化来提升应用性能和可扩展性。1)缓存数据:使用Redis缓存频繁访问的数据,提高数据访问速度。2)分布式锁:利用Redis实现分布式锁,确保在分布式环境中操作的安全性。3)数据持久化:通过RDB和AOF机制保证数据安全性,防止数据丢失。

Redis的数据模型和结构包括五种主要类型:1.字符串(String):用于存储文本或二进制数据,支持原子操作。2.列表(List):有序元素集合,适合队列和堆栈。3.集合(Set):无序唯一元素集合,支持集合运算。4.有序集合(SortedSet):带分数的唯一元素集合,适用于排行榜。5.哈希表(Hash):键值对集合,适合存储对象。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver Mac版
视觉化网页开发工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

WebStorm Mac版
好用的JavaScript开发工具