使用 Redis 如何实现查询附近的人?「视频版」——面试突击 003 期
面试问题
Redis 如何实现查询附近的人?
涉及知识点
- Redis 中如何操作位置信息?
- GEO 底层是如何实现的?
- 如何在程序实现查询附近的人?
- 在实际使用中需要注意哪些问题?
视频答案
视频地址:https://www.bilibili.com/video/av89369236/
图文答案
Redis 中要实现查询附近的人,需要使用 Redis 3.2 版本中提供的 GEO 数据类型,它包含以下几个重要的方法:
- GEOADD 添加元素位置信息;
- GEOPOS 查询元素经纬度信息;
- GEODIST 查询两个元素的直线距离;
- 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 期相关推荐
- Redis 中的过期元素是如何被处理的?「视频版」——面试突击 002 期
本文以面试问题「Redis 中的过期元素是如何被处理的?」为切入点,用视频加图文的方式和大家聊聊 Redis 过期元素被处理的相关知识点. 涉及的知识点 过期删除策略有哪些? 这些过期策略有哪些优缺点 ...
- Redis都不懂?就别去面试了!聊聊我的Redis新专栏「视频版」
前不久,有一个读者在后台留言,说他面试 Java 开发工程师岗位时,居然大部分的面试问题都是关于 Redis ,他都差点都忘记了自己应聘的是 Java 工程师了.而然这种现象在现在的后端面试中很常见, ...
- 面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版
这是我的第 33 篇原创文章 作者 | 王磊 (javacn666) 1 面试问题 Redis 如何实现查询附近的人? 2 相关面试问题 Redis 中如何操作位置信息? GEO 底层是如何实现的? ...
- 面试突击 005 | Redis 是如何实现高可用的?它的实现方式有哪些?「视频版」
这是我的第 35 篇原创文章 作者 | 老王(javacn666) 这部视频的录制.剪辑.做 PPT.写文稿大约花费了 5 个小时的时间,希望这种形式能被更多的人喜欢,希望这篇文章会给你带来更多的价值 ...
- 虚拟与现实!深兰科技打造湖北首个街区数字主理人「江妮」
最近有一位"来自平行数字宇宙"的"她"真实地出现在武汉人民生活当中,用数字的形象和AIGC的能力为江汉路数字街区增添了一抹未来的科技色彩."她&quo ...
- 这或才是产品人「年终奖」的真实情况!
我在上一篇文章末尾(2021年终奖公布!产品人,你达标了么?),放置了一个关于「2021年产品人年终奖的小调研」. 今天就把调研结论分享给大家,看看产品人的年终奖是什么状况. 分享前说一句,因为调研题 ...
- 万人「变阵冲刺」,京东数科没有终点
[深几度·深度报道系列] 2019年3月,莫雄剑听闻老同事郭沐要来京东数科智能城市部,他兴奋中又有几分隐忧. 郭沐做出这种选择不难理解,他当时工作进入瓶颈期.一年前,微软亚洲研究院城市计算领域负责人郑 ...
- 微软辟谣裁员1.1万人/ 「美版视觉中国」起诉AI侵权/ 马斯克收购推特首期利息将到期…今日更多新鲜事在此...
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 日报君 发自 凹非寺 量子位 | 公众号 QbitAI 大家好,今天 ...
- 打工人「工作群」如何正确使用表情包?
文末有福利 如何正确使用表情包? #2021打工人# 叮咚,叮咚 "未读群消息99+" x 9:00 AM # 元气清晨 # 打工人的一天 从元气满满的早安开始 让老板感受到你的 ...
最新文章
- 通俗介绍拉普拉斯变换,傅里叶变换和z变换
- (干货)构建镜像之docker commit
- python如何读取文件夹下的子文件夹
- python数据处理随笔总结
- OPENCV+VS+QT,导入生成别人的.pro文件时提示opencv文件找不到,C1083:无法打开包括文件 opencv2/opencv.hpp
- 关于vs2017如何配置和运行龙书DX9案例
- gnu coreutils4.5.1 hostid.c源码解读
- mac关闭自动更新提示
- UVa 10603 - Fille
- Bootstrap模板-Minimal.2.1.1
- RTI1.3时间管理支持的两种模式
- 【JPA】SpringData JPA
- 【量化策略】横盘策略20211209
- 【python】微博热点话题舆情聚类分析
- 基于Python的Django框架的二手物品交易平台的设计与实现
- uniapp开发——微信小程序获取上传图片的拍摄时间(附源码)
- 大数据之Flume:Flume概述
- systemctl 实现开机自启服务
- jd实习生面试过程记录
- 经验:几个985/211/普通院校的本科生/研究生高薪大数据学习全程记录,笔记心得,求职面试