Redis 实现 查找附近的人 功能

概述

使用 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 操作的性能通常非常高,适合需要实时处理地理数据的应用场景,如社交、物流、旅游、共享经济等领域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值