面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版
這是我的第?33?篇原創(chuàng)文章
作者 |?王磊?(javacn666)
1 面試問(wèn)題
Redis 如何實(shí)現(xiàn)查詢附近的人?
2 相關(guān)面試問(wèn)題
Redis 中如何操作位置信息?
GEO 底層是如何實(shí)現(xiàn)的?
如何在程序?qū)崿F(xiàn)查詢附近的人?
在實(shí)際使用中需要注意哪些問(wèn)題?
3 相關(guān)答案
Redis 中要實(shí)現(xiàn)查詢附近的人,需要使用 Redis 3.2 版本中提供的 GEO 數(shù)據(jù)類型,它包含以下幾個(gè)重要的方法:
GEOADD 添加元素位置信息;
GEOPOS 查詢?cè)亟?jīng)緯度信息;
GEODIST 查詢兩個(gè)元素的直線距離;
GEORADIUS 查詢附近一定距離內(nèi)的元素信息。
首先我們可以使用百度提供的經(jīng)緯度查詢工具來(lái)確定位置信息,地址:我們先用百度地圖提供的經(jīng)緯度查詢工具,地址:http://api.map.baidu.com/lbsapi/getpoint/index.html
命令使用詳見(jiàn)視頻部分。
3 視頻演示
視頻內(nèi)容如下:
4 代碼實(shí)戰(zhàn)
下面我們用 Java 代碼,來(lái)實(shí)現(xiàn)查詢附近的人,完整代碼如下:
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());}} }以上程序執(zhí)行的結(jié)果如下:
小明和小紅相距:3.9153 KM
小明附近的人:xiaohong
5 總結(jié)
GEO 是 Redis ?3.2 版本中引入的功能,只有升級(jí)到 3.2+ 才能使用,GEO 本質(zhì)上是基于 ZSet 實(shí)現(xiàn)的,這點(diǎn)在 Redis 源碼找到相關(guān)信息,我們可以 GEO 使用實(shí)現(xiàn)查找附近的人或者附近的地點(diǎn),還可以用它來(lái)計(jì)算兩個(gè)位置相隔的直線距離。
【END】
近期熱文
面試突擊第 2 期?| Redis 是如何處理已過(guò)期元素的?視頻版
面試突擊第 1 期 | Redis 如何從海量數(shù)據(jù)中查詢出某一個(gè) Key?視頻版
面試珍藏:最常見(jiàn)的200多道Java面試題(2019年最新版)
Java面試詳解(2020版):500+ 面試題和核心知識(shí)點(diǎn)詳解
關(guān)注下方二維碼,訂閱更多精彩內(nèi)容
朕已閱?
總結(jié)
以上是生活随笔為你收集整理的面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 你真的理解零拷贝了吗?
- 下一篇: Redis中的键值过期操作