欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > Redis 实现 查找附近的人 功能

Redis 实现 查找附近的人 功能

2024/10/25 16:26:04 来源:https://blog.csdn.net/m0_64289188/article/details/142783411  浏览:    关键词:Redis 实现 查找附近的人 功能

文章目录

      • 概述
      • Redis 中 Geospatial(地理位置)
      • Demo例子
      • 总结

概述

使用 Redis 实现“查找附近的人”功能,通常会依赖 Redis 的 Geo(地理位置) 数据类型来存储用户的经纬度,并基于此进行地理范围查询。Redis 通过 GEOADDGEORADIUS 等命令来存储用户位置和查找一定范围内的用户。

存储用户的地理位置:我们需要存储用户的经纬度信息,以便后续可以基于此进行地理查询。Redis 提供了 GEOADD 命令,允许将用户的经纬度信息存储在 Redis 中的有序集合中(底层基于 ZSet 实现)。

根据当前用户的位置查找附近的用户 :使用 GEORADIUSGEORADIUSBYMEMBER 命令,基于某个位置的经纬度或某个已有用户的位置,查询一定范围内的其他用户。

Redis 中 Geospatial(地理位置)

  • 描述:Redis 提供对地理位置的支持,允许存储经纬度坐标并基于此进行地理范围内的查询。
  • 常用命令
    • GEOADD key longitude latitude member:将地理空间信息添加到 key 中。
    • GEODIST key member1 member2:计算两个成员之间的距离。
    • GEORADIUS key longitude latitude radius:查询指定半径内的所有成员。
    • GEOPOS key member:返回成员的经纬度。

Demo例子

public class NearbyPeopleService {private Jedis jedis;public NearbyPeopleService() {// 连接 Redisjedis = new Jedis("localhost", 6379);}/*** 添加用户的地理位置信息** @param userId    用户的唯一标识* @param longitude 经度* @param latitude  纬度*/public void addUserLocation(String userId, double longitude, double latitude) {String key = "user_locations"; // 存储用户位置的 keyjedis.geoadd(key, longitude, latitude, userId); // 使用 GEOADD 存储用户位置System.out.println("Added user location: " + userId);}/*** 查找附近的人** @param longitude 当前用户的经度* @param latitude  当前用户的纬度* @param radius    查找半径* @return 附近的用户列表*/public List<GeoRadiusResponse> findNearbyPeople(double longitude, double latitude, double radius) {String key = "user_locations"; // 存储用户位置的 key// 使用 GEORADIUS 查找附近的用户List<GeoRadiusResponse> nearbyPeople = jedis.georadius(key, longitude, latitude, radius, GeoUnit.KM);return nearbyPeople;}public static void main(String[] args) {NearbyPeopleService service = new NearbyPeopleService();// 假设有几个用户的地理位置service.addUserLocation("user1", 116.4074, 39.9042);  // 北京service.addUserLocation("user2", 121.4737, 31.2304);  // 上海service.addUserLocation("user3", 113.2644, 23.1291);  // 广州service.addUserLocation("user4", 114.0579, 22.5431);  // 深圳// 查找北京附近 1500 公里以内的用户List<GeoRadiusResponse> nearbyPeople = service.findNearbyPeople(116.4074, 39.9042, 1500);System.out.print("北京附近 1500 公里以内的用户:");for (GeoRadiusResponse response : nearbyPeople) {System.out.print(response.getMemberByString() + " "); // 输出附近的用户 ID}}
}

结果:
在这里插入图片描述

总结

Redis 的 Geo 功能非常适合用于处理与地理位置相关的需求,尤其是在需要高效地进行地理范围查询、距离计算或位置排序的场景中。由于 Redis 是内存存储,Geo 操作的性能通常非常高,适合需要实时处理地理数据的应用场景,如社交、物流、旅游、共享经济等领域。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com