面試突擊第 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 如何實現查詢附近的人?視頻實戰版
相關文章
相關標籤/搜索