Redis实战篇(四)基于GEO实现查找附近的人功能

如果现在要开发一个功能:

要为一款交友App实现查找附近的人,并按距离进行排序。

image

让你来开发这个功能,你会如何实现?

MySQL 不合适

你可能想到,把用户用户的经纬度坐标使用MySQL等关系数据库(用户id,经度x,纬度y)存储,但是该如何计算距离和排序呢?

不可能通过遍历来计算所有的用户和目标用户的距离,然后再进行排序,因为这个计算量太大了,性能指标肯定无法满足。

GeoHash的编码方法

为了能高效地对经纬度进行比较,Redis 采用了业界广泛使用的 GeoHash 编码方法,这个方法的基本原理是“二分区间,区间编码”。

关于 GeoHash 参考 https://www.cnblogs.com/LBSer/p/3310455.html。

简单来说,GeoHash 能够将二维的经纬度转换为字符串,然后位置就能够直接进行比较和范围查询了。

Redis 中 Geo 的使用 命令   说明    可用版本   时间复杂度  
GEOADD   添加位置的经纬度   >= 3.2.0   O(logN)  
GEOPOS   返回位置的经纬度   >= 3.2.0   O(logN)  
GEODIST   返回两个位置的距离   >= 3.2.0   O(logN)  
GEORADIUS   返回与指定位置距离距离不大于指定值的位置的经纬度   >= 3.2.0   O(N+logM)  
GEORADIUSBYMEMBER   这个命令和 GEORADIUS 命令一样   >= 3.2.0   O(logN+M)  
GEOHASH   返回位置的 GeoHash 值   >= 3.2.0   O(logN)  

 

 示例

假设用户ID是33,经纬度位置是(116.054579, 39.030452),我们可以用一个 GEO 集合保存所有用户的经纬度,集合 key 是 users:locations。执行下面的这个命令,就可以把ID号为33的用户的当前经纬度位置存入GEO集合中:

GEOADD users:locations 116.034579 39.030452 33

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxdyx.html