面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版

面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版
这是个人第 33 篇原创文章
做者 | 王磊 (javacn666)
1 面试问题html

Redis 如何实现查询附近的人?
2 相关面试问题java

  • Redis 中如何操做位置信息?
  • GEO 底层是如何实现的?
  • 如何在程序实现查询附近的人?
  • 在实际使用中须要注意哪些问题?
    面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版
    3 相关答案

Redis 中要实现查询附近的人,须要使用 Redis 3.2 版本中提供的 GEO 数据类型,它包含如下几个重要的方法:面试

  1. GEOADD 添加元素位置信息;
  2. GEOPOS 查询元素经纬度信息;
  3. GEODIST 查询两个元素的直线距离;
  4. GEORADIUS 查询附近必定距离内的元素信息。
    首先咱们能够使用百度提供的经纬度查询工具来肯定位置信息,地址:咱们先用百度地图提供的经纬度查询工具,地址:http://api.map.baidu.com/lbsapi/getpoint/index.html
    面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版
    命令使用详见视频部分。
    3 视频演示

视频内容以下:redis

4 代码实战api

下面咱们用 Java 代码,来实现查询附近的人,完整代码以下:ide

import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.GeoRadiusResponse;
import redis.clients.jedis.GeoUnit;
import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class GeoHashExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        Map<String, GeoCoordinate> map = new HashMap<>();
        // 添加小明的位置
        map.put("xiaoming", new GeoCoordinate(116.404269, 39.913164));
        // 添加小红的位置
        map.put("xiaohong", new GeoCoordinate(116.36, 39.922461));
        // 添加小美的位置
        map.put("xiaomei", new GeoCoordinate(116.499705, 39.874635));
        // 添加小二
        map.put("xiaoer", new GeoCoordinate(116.193275, 39.996348));
        jedis.geoadd("person", map);
        // 查询小明和小红的直线距离
        System.out.println("小明和小红相距:" + jedis.geodist("person", "xiaoming",
                "xiaohong", GeoUnit.KM) + " KM");
        // 查询小明附近 5 千米的人
        List<GeoRadiusResponse> res = jedis.georadiusByMemberReadonly("person", "xiaoming",
                5, GeoUnit.KM);
        for (int i = 1; i < res.size(); i++) {
            System.out.println("小明附近的人:" + res.get(i).getMemberByString());
        }
    }
}

以上程序执行的结果以下:
小明和小红相距:3.9153 KM
小明附近的人:xiaohong
5 总结工具

GEO 是 Redis 3.2 版本中引入的功能,只有升级到 3.2+ 才能使用,GEO 本质上是基于 ZSet 实现的,这点在 Redis 源码找到相关信息,咱们能够 GEO 使用实现查找附近的人或者附近的地点,还能够用它来计算两个位置相隔的直线距离。
【END】
近期热文code

  • 面试突击第 2 期 | Redis 是如何处理已过时元素的?视频版
  • 面试突击第 1 期 | Redis 如何从海量数据中查询出某一个 Key?视频版
  • 面试珍藏:最多见的200多道Java面试题(2019年最新版)
  • Java面试详解(2020版):500+ 面试题和核心知识点详解
    关注下方二维码,订阅更多精彩内容
    面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版
相关文章
相关标签/搜索