這是個人第 33 篇原創文章
做者 | 王磊 (javacn666)
1 面試問題html
Redis 如何實現查詢附近的人?
2 相關面試問題java
Redis 中要實現查詢附近的人,須要使用 Redis 3.2 版本中提供的 GEO 數據類型,它包含如下幾個重要的方法:面試
視頻內容以下: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