Redis 如何實現查詢附近的距離


注:轉

面試問題

Redis 如何實現查詢附近的人?

涉及知識點

  1. Redis 中如何操作位置信息?
  2. GEO 底層是如何實現的?
  3. 如何在程序實現查詢附近的人?
  4. 在實際使用中需要注意哪些問題?

圖文答案

Redis 中要實現查詢附近的人,需要使用 Redis 3.2 版本中提供的 GEO 數據類型,它包含以下幾個重要的方法:

  1. GEOADD 添加元素位置信息;
  2. GEOPOS 查詢元素經緯度信息;
  3. GEODIST 查詢兩個元素的直線距離;
  4. GEORADIUS 查詢附近一定距離內的元素信息。

首先我們可以使用百度提供的經緯度查詢工具來確定位置信息,地址:我們先用百度地圖提供的經緯度查詢工具,地址:http://api.map.baidu.com/lbsapi/getpoint/index.html

 

 代碼:

    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        Map<String, GeoCoordinate> map = new HashMap<>();
        // 添加A的位置
        map.put("A", new GeoCoordinate(116.404269, 39.913164));
        // 添加B的位置
        map.put("B", new GeoCoordinate(116.36, 39.922461));
        // 添加C的位置
        map.put("C", new GeoCoordinate(116.499705, 39.874635));
        // 添加D的位置
        map.put("D", new GeoCoordinate(116.193275, 39.996348));
        jedis.geoadd("person", map);
        // 查詢A和B的直線距離
        System.out.println("A和B相距:" + jedis.geodist("person", "A",
                "B", GeoUnit.KM) + " KM");
        // 查詢A附近 5 公里的人
        //jedis.georadiusByMemberReadonly()
        List<GeoRadiusResponse> res = jedis.georadiusByMember("person", "A",
                5, GeoUnit.KM);
        for (int i = 1; i < res.size(); i++) {
            System.out.println("A附近的人:" + res.get(i).getMemberByString());
        }
    }

總結

GEO 是 Redis 3.2 版本中新增的功能,只有升級到 3.2+ 才能使用,GEO 本質上是基於 ZSet 實現的,這點在 Redis 源碼找到相關信息,我們可以 GEO 使用實現查找附近的人或者附近的地點,還可以用它來計算兩個位置相隔的直線距離。

圖文答案

Redis 中要實現查詢附近的人,需要使用 Redis 3.2 版本中提供的 GEO 數據類型,它包含以下幾個重要的方法:

  1. GEOADD 添加元素位置信息;
  2. GEOPOS 查詢元素經緯度信息;
  3. GEODIST 查詢兩個元素的直線距離;
  4. GEORADIUS 查詢附近一定距離內的元素信息。

首先我們可以使用百度提供的經緯度查詢工具來確定位置信息,地址:我們先用百度地圖提供的經緯度查詢工具,地址:http://api.map.baidu.com/lbsapi/getpoint/index.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM