查询附近的人或者是附近的商家是一个实用且常用的功能,比如微信中“附近的人”或是美团外卖中“附近商家”等,如下图所示:
image.png image.png那它是如何实现的呢?我们本文就一起来看。
我们本文的面试题是,使用 Redis 如何实现查询附近的人?
典型回答
在说如何实现地理位置查询之前,首先我们需要搞清楚地理位置查询的基础知识。
我们所处的任何位置都可以用经度和纬度来标识,经度的范围 -180 到 180,纬度的范围为:-90 到 90。纬度以赤道为界,赤道以南为负数,赤道以北为正数;经度以本初子午线 (英国格林尼治天文台) 为界,东边为正数,西边为负数。这样我们所处的位置才能在地球上被标注出来,这也成为了我们能够查询出两点之间距离的基础,如下图所示: image.png从而让查询附近的人变得简单了,我们只需要查询出附近几个点和自己的距离,再进行排序就可以实现查询附近人的功能了,然而使用 Redis 让这一切更简单了,Redis 为我们提供了专门用来存储地理位置的类型 GEO,我们使用它以及它所内置的方法就可以轻松的实现查询附近的人了。
我们可以使用 Redis 3.2 版本中新增了 GEO 类型,以及它的 georadius 命令来实现查询附近的人,例如我们可以先添加几个人的位置信息,实现命令如下:
127.0.0.1:6379> geoadd site 116.404269 39.913164 tianan
(integer) 1
127.0.0.1:6379> geoadd site 116.36 39.922461 yuetan
(integer) 1
127.0.0.1:6379> geoadd site 116.499705 39.874635 huanle
(integer) 1
127.0.0.1:6379> geoadd site 116.193275 39.996348 xiangshan
(integer) 1
添加位置信息我们需要使用 geoadd 命令,它的语法为:geoadd key longitude latitude member [longitude latitude member ...]
其中:
- longitude 表示经度;
- latitude 表示纬度;
- member 是为此经纬度起的名字。
此命令支持一次添加一个或多个位置信息。
我们在查询某个人(某个经纬度)附近的人,实现命令如下:
127.0.0.1:6379> georadius site 116.405419 39.913164 5 km
1) "tianan"
2) "yuetan"
从上述结果中可以看出在经纬度为 116.405419,39.913164 的附近五公里范围内有两个人“tianan”和“月坛”,于是查询附近人的功能就算实现完成了。
georadius 命令的相关语法为: georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC]
georadius 命令可以使用以下其中一个单位:
- m 表示单位为米;
- km 表示单位为千米;
- mi 表示单位为英里;
- ft 表示单位为英尺;
georadius 命令包含的可选参数如下。
① WITHCOORD
说明:返回满足条件位置的经纬度信息。 示例代码:
127.0.0.1:6379> georadius site 116.405419 39.913164 5 km withcoord
1) 1) "tianan"
2) 1) "116.40426903963088989"
2) "39.91316289865137179"
2) 1) "yuetan"
2) 1) "116.36000186204910278"
2) "39.92246025586381819"
网友评论