之前有过一篇 《MySQL查询附近的人》,在平时使用过程中,人少的情况下还是可以的,但是最近应用人多了,所以考虑到性能问题,有了此文

我用提最新的Redis 6.0了,主要使用的是Redis的geo数据类型,如果你的不支持,请检查一下版本号
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。

Redis GEO 操作方法有:

geoadd:添加地理位置的坐标。
geopos:获取地理位置的坐标。
geodist:计算两个位置之间的距离。
georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
geohash:返回一个或多个位置对象的 geohash 值。

开撸

连接Redis

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//$redis->auth(['user' => 'default', 'pass' => 'password']);    //如果你要是设置了密码,或者启用了ACL了,你就知道这货是干撒的了...
//注意这个user,redis6之后默认用户名 default

记录用户定位信息
我这里主要用 user: 来做标记记录坐标信息

$redis->geoAdd("KEY", longitude, latitude, "member:1");
$redis->geoAdd("KEY", longitude, latitude, "member:2");

GETADD说明【可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中】

GEOADD key longitude latitude member [longitude latitude member ...]

找出我附近10km内的100个人

$options = ['WITHDIST', 'COUNT' => 100, 'ASC'];
$lists = $redis->geoRadius('KEY', longitude, latitude, 10, 'km', $options);

GEORADIUS 参数 可参考官方文档

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

参数说明:

m  :米,默认单位;km :千米;mi :英里;ft :英尺。
WITHDIST : 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH : 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
COUNT    : 限定返回的记录数。
ASC      : 查找结果根据距离从近到远排序。
DESC.    : 查找结果根据从远到近排序。

查询两个会员之间的距离

$result = $redis->geoDist('KEY', , member1, member2, 'km');

GEODIST 参数

GEODIST key member1 member2 [m|km|ft|mi]