面试问题

Redis 如何实现查询附近的人?

涉及知识点

  1. Redis 中如何操作位置信息?
  2. GEO 底层是如何实现的?
  3. 如何在程序实现查询附近的人?
  4. 在实际使用中需要注意哪些问题?

视频答案

视频地址:https://www.bilibili.com/video/av89369236/

图文答案

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

  1. GEOADD 添加元素位置信息;
  2. GEOPOS 查询元素经纬度信息;
  3. GEODIST 查询两个元素的直线距离;
  4. GEORADIUS 查询附近一定距离内的元素信息。

首先我们可以使用百度提供的经纬度查询工具来确定位置信息,地址:我们先用百度地图提供的经纬度查询工具,地址:http://api.map.baidu.com/lbsapi/getpoint/index.html

命令使用详见视频部分。

代码实战

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

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

总结

GEO 是 Redis 3.2 版本中新增的功能,只有升级到 3.2+ 才能使用,GEO 本质上是基于 ZSet 实现的,这点在 Redis 源码找到相关信息,我们可以 GEO 使用实现查找附近的人或者附近的地点,还可以用它来计算两个位置相隔的直线距离。

使用 Redis 如何实现查询附近的人?「视频版」——面试突击 003 期相关推荐

  1. Redis 中的过期元素是如何被处理的?「视频版」——面试突击 002 期

    本文以面试问题「Redis 中的过期元素是如何被处理的?」为切入点,用视频加图文的方式和大家聊聊 Redis 过期元素被处理的相关知识点. 涉及的知识点 过期删除策略有哪些? 这些过期策略有哪些优缺点 ...

  2. Redis都不懂?就别去面试了!聊聊我的Redis新专栏「视频版」

    前不久,有一个读者在后台留言,说他面试 Java 开发工程师岗位时,居然大部分的面试问题都是关于 Redis ,他都差点都忘记了自己应聘的是 Java 工程师了.而然这种现象在现在的后端面试中很常见, ...

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

    这是我的第 33 篇原创文章 作者 | 王磊 (javacn666) 1 面试问题 Redis 如何实现查询附近的人? 2 相关面试问题 Redis 中如何操作位置信息? GEO 底层是如何实现的? ...

  4. 面试突击 005 | Redis 是如何实现高可用的?它的实现方式有哪些?「视频版」

    这是我的第 35 篇原创文章 作者 | 老王(javacn666) 这部视频的录制.剪辑.做 PPT.写文稿大约花费了 5 个小时的时间,希望这种形式能被更多的人喜欢,希望这篇文章会给你带来更多的价值 ...

  5. 虚拟与现实!深兰科技打造湖北首个街区数字主理人「江妮」

    最近有一位"来自平行数字宇宙"的"她"真实地出现在武汉人民生活当中,用数字的形象和AIGC的能力为江汉路数字街区增添了一抹未来的科技色彩."她&quo ...

  6. 这或才是产品人「年终奖」的真实情况!

    我在上一篇文章末尾(2021年终奖公布!产品人,你达标了么?),放置了一个关于「2021年产品人年终奖的小调研」. 今天就把调研结论分享给大家,看看产品人的年终奖是什么状况. 分享前说一句,因为调研题 ...

  7. 万人「变阵冲刺」,京东数科没有终点

    [深几度·深度报道系列] 2019年3月,莫雄剑听闻老同事郭沐要来京东数科智能城市部,他兴奋中又有几分隐忧. 郭沐做出这种选择不难理解,他当时工作进入瓶颈期.一年前,微软亚洲研究院城市计算领域负责人郑 ...

  8. 微软辟谣裁员1.1万人/ 「美版视觉中国」起诉AI侵权/ 马斯克收购推特首期利息将到期…今日更多新鲜事在此...

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 日报君 发自 凹非寺 量子位 | 公众号 QbitAI 大家好,今天 ...

  9. 打工人「工作群」如何正确使用表情包?

    文末有福利 如何正确使用表情包? #2021打工人# 叮咚,叮咚 "未读群消息99+" x 9:00 AM # 元气清晨 # 打工人的一天 从元气满满的早安开始  让老板感受到你的 ...

最新文章

  1. 通俗介绍拉普拉斯变换,傅里叶变换和z变换
  2. (干货)构建镜像之docker commit
  3. python如何读取文件夹下的子文件夹
  4. python数据处理随笔总结
  5. OPENCV+VS+QT,导入生成别人的.pro文件时提示opencv文件找不到,C1083:无法打开包括文件 opencv2/opencv.hpp
  6. 关于vs2017如何配置和运行龙书DX9案例
  7. gnu coreutils4.5.1 hostid.c源码解读
  8. mac关闭自动更新提示
  9. UVa 10603 - Fille
  10. Bootstrap模板-Minimal.2.1.1
  11. RTI1.3时间管理支持的两种模式
  12. 【JPA】SpringData JPA
  13. 【量化策略】横盘策略20211209
  14. 【python】微博热点话题舆情聚类分析
  15. 基于Python的Django框架的二手物品交易平台的设计与实现
  16. uniapp开发——微信小程序获取上传图片的拍摄时间(附源码)
  17. 大数据之Flume:Flume概述
  18. systemctl 实现开机自启服务
  19. jd实习生面试过程记录
  20. 经验:几个985/211/普通院校的本科生/研究生高薪大数据学习全程记录,笔记心得,求职面试

热门文章

  1. bash shell是如何识别特殊符号的
  2. MIP技术交流分享(3月9日)
  3. Degree Sequence of Graph G【模拟】
  4. Centos 7初始化脚本
  5. wdcp支持两种安装方式
  6. 深入研究java.lang.Runtime类【转】
  7. 分析容灾备份建设需求
  8. JavaScript 经典代码大全2
  9. 使用Notepad++来比较文件
  10. dubbo 支持服务降级吗_dubbo面试题!会这些,说明你真正看懂了dubbo源码