当前位置: 首页 > article >正文

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() {
        // 连接 Redis
        jedis = new Jedis("localhost", 6379);
    }

    /**
     * 添加用户的地理位置信息
     *
     * @param userId    用户的唯一标识
     * @param longitude 经度
     * @param latitude  纬度
     */
    public void addUserLocation(String userId, double longitude, double latitude) {
        String key = "user_locations"; // 存储用户位置的 key
        jedis.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 操作的性能通常非常高,适合需要实时处理地理数据的应用场景,如社交、物流、旅游、共享经济等领域。


http://www.kler.cn/news/339863.html

相关文章:

  • 如何优化spotbugsXml.xml文件来方便debug的落地方案来了
  • 渗透测试---01docker镜像和容器指令合集
  • kubeadm部署k8s1.28.0主从集群(cri-dockerd)
  • 使用Android studio进行Unit Test中遇到的问题记录
  • 前端编程艺术(3)---JavaScript
  • 开源 Three.js 案例及入门教程
  • uni-app之旅-day03-搜索
  • Jenkins打包,发布,部署
  • 【Golang】语法基础——切片:灵活、高效的数据处理利器
  • 如何查看是否是ip转发?
  • 自动化测试selenium篇(一)
  • 数字通信中不同信道类型对通信系统性能影响matlab仿真分析,对比AWGN,BEC,BSC以及多径信道
  • JavaWeb 15.详解Servlet及其源码
  • HTTP 和 WebSocket
  • PHP爬虫:获取商品SKU详细信息的利器
  • openpnp - ReferenceStripFeeder config
  • 【SQL】掌握SQL查询技巧:数据分组与排序
  • k8s实战-1
  • C++:string (用法篇)
  • linuxshell日常脚本命令之sed命令