我们在App上,经常能看到【查找附近的人】这么个功能,但是你知道它是怎么实现的吗?
Redis的GEO功能
Redis的3.2版本提供了GEO功能,能够方便地进行地理位置信息的存储与查找
存储经纬度信息
#命令格式:GEOADD key 经度 维度 member |
---|
GEOADD USER:LOCATION 114.18612410 22.29358599 HongKongAlice |
获取成员的地理位置信息
#命令格式:GEOPOS key member |
---|
geopos USER:LOCATION HongKongAlice |
计算两个坐标之间的距离
unit表示单位有以下四个值:
- m (meter) 代表米
- km (kilometer)代表千米
- mi (miles)代表英里
- ft (ft)代表尺
#命令格式:geodist key member1 member2 [unit] |
---|
geodist USER:LOCATION HangZhouTom HongKongAlice km |
获取指定位置范围内的所有地理位置
以下命令可以实现附近的人功能
#命令格式:georadius key 经度 维度 距离 [unit] |
---|
georadius USER:LOCATION 114.18612509965897 22.293586120392426 2000 km |
#命令格式:georadiusbymember key member 距离 [unit] |
georadiusbymember USER:LOCATION HongKongAlice 2000 km |
删除地理位置信息
GEO没有提供删除的命令,但是因为本身是由zset实现的,可以使用zrem对地理位置进行删除
zrem key member |
---|
zrem USER:LOCATION HongKongAlice |
查找附近的人功能实现三步骤
1.获取定位信息
2.经纬度信息存储
3.经纬度信息查询
第一步:获取定位信息
获取定位信息的3种方式
1.基于你连接的Wifi热点
wifi热点的位置是固定,你只要连了wifi,就能将你的位置锁定在一个范围内
2.基于移动基站定位
你的手机信号是移动基站提供的,当你的手机连接多个基站的信号,不同基站信号衰减不同,根据衰减情况与基站位置,大致确定你当前所在范围。
3.通过卫星定位
通过接收GPS、北斗等卫星的信号来计算出当前位置,该方法是最精准的。
如果通过编程获取定位信息
1.通过android、iOS提供的API来获取定位信息
2.通过第三方API来获取定位信息,如高德地图API、百度地图API等
第二步:经纬度信息的存储
public void addGeoInfos(){
String key="USER:LOCATION";
//添加地理位置与人
redisTemplate.opsForGeo().add(key,new Point(114.18612509965897,22.293586120392426),"liSa");
redisTemplate.opsForGeo().add(key,new Point(120.21551180,30.25308298),"Alice");
}
第三步:查找附近所有的人
public void findNearByMembers() {
//key值
String key="USER:LOCATION";
//member
String member="Alice";
//距离
Distance distance=new Distance(2000, RedisGeoCommands.DistanceUnit.KILOMETERS);
//查找数据
GeoResults<RedisGeoCommands.GeoLocation<Object>> results= redisTemplate.opsForGeo().radius(key,member,distance);
//打印结果
List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> list= results.getContent();
for (GeoResult<RedisGeoCommands.GeoLocation<Object>> location:list){
System.out.println(location.getContent().getName());
}
}