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

面试问题

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

img

命令使用详见视频部分。

代码实战

下面我们用 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 使用实现查找附近的人或者附近的地点,还可以用它来计算两个位置相隔的直线距离。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用URL

2019独角兽企业重金招聘Python工程师标准>>> Problem You have a HTML document that contains relative URLs, which you need to resolve to absolute URLs. Solution Make sure you specify a base URI when parsing the document (which is implicit when loadi…

Win10安装DBeaver连接MySQL8、导入和导出数据库详细教程

一、DBeaver简介 ​ DBeaver 是一个基于 Java 开发&#xff0c;免费开源的通用数据库管理和开发工具&#xff0c;使用非常友好&#xff0c;且遵循ASL 协议。由于 DBeaver 基于 Java 开发&#xff0c;可以运行在各种操作系统上&#xff0c;比如Windows、Linux、macOS 等操作系统…

「视频版」当线程池溢出之后,程序会奔溃吗?面试突击 007 期

哈喽&#xff0c;大家好&#xff0c;我是老王&#xff0c;欢迎来到第 7 期的 Java 面试突击。本文的面试题是&#xff0c;当线程池的任务溢出之后&#xff0c;程序会奔溃吗&#xff1f;这个问题问的是关于线程池的任务数超过线程池的承载能力之后&#xff0c;会出现什么情况&am…

有人说:轻量级锁一定比重量级锁快!我忍不住笑了

世界上不止有黑白两色&#xff0c;黑与白之间还是灰色的地带。在成人的世界里&#xff0c;大多数人喜欢非黑即白的观点来看待一个问题&#xff0c;例如《十二公民》中那个刚开始所有人都认定的“一定是富二代杀S了自己的亲身父亲”&#xff0c;到最后大家理性分析和推测之后发现…

Python Django设计模式及模板层

一、Django的MTV模式 MTV代表Model - Template - View &#xff08;模型-模板-视图&#xff09;模式。 M模型层&#xff08;Model&#xff09;负责与数据交互。 T模板层&#xff08;Template&#xff09;负责呈现内容到浏览器。 V视图层&#xff08;View&#xff09;是核心&…

在Tomcat中配配置数据源汇总

为什么80%的码农都做不了架构师&#xff1f;>>> Tomcat本身不具备处理提供数据源的能力。借助于一些开源数据源实现&#xff0c;如&#xff1a;DBCP和C3P0等。 一、在http://commons.apache.org/可下载这些是Tomcat提供配置数据源所需的类库。 注意&#xff1a;Tom…

Linux debian安装、配置和使用PuTTY教程

PuTTY是一个小巧、好用、免费的跨平台的访问Linux服务器的终端工具。PuTTY工具可以使用Telnet、SSH、rlogin、纯TCP以及串行接口连接服务器&#xff0c;使用非常广泛。本文主要介绍Debian系统如何安装PuTTY和如何设置该工具的字体、颜色。从而实现个性化定制自己的PuTTY工具&am…

Linux Debian安装FileZilla文件远程传输工具

一、FileZilla简介 FileZilla是一个快速、免费、跨平台的FTP软件&#xff0c;实用多功能和界面直观的FTP客户端。FileZilla是Windows&#xff0c;Linux&#xff0c;MacOSX等跨平台的图形化FTP&#xff0c;SFTP和FTPS文件管理工具。通过大量直观的工具&#xff0c;FileZilla可以…

Linux Debian11使用国内源安装 Docker 环境

首先切换到root账户&#xff1a; su 一、Debian安装Docker 1.更新并安装一些必要系统工具。 sudo apt-get update sudo apt-get upgrade sudo apt-get install \apt-transport-https \software-properties-common \ca-certificates \curl \gnupg \lsb-release2.安装GPG证书…

计算机网络怎么寻址_计算机网络中的无类寻址

计算机网络怎么寻址To reduce the wastage of IP addresses in blocks we subnetting. But in Classless addressing wastage of IP addresses in a block is more reduced than Classful subnetting. In this variable length, blocks are used that belongs to no class. 为了…

Linux Debian常用下载工具Transmission和qbittorrent

1.Transmission Transmission是Linux Debian系统下的系统自带的一种BitTorrent客户端下载工具&#xff0c;下载速度比较快。在Linux系统可以替代windows上的迅雷下载工具。 2.qbittorrent 使用下面命令安装&#xff1a; sudo apt-get install qbittorrent获取更多资料&#x…

《 面试又翻车了》这次竟然和 Random 有关?

小强最近面试又翻车了&#xff0c;然而令他郁闷的是&#xff0c;这次竟然是栽到了自己经常在用的 Random 上......面试问题既然已经有了 Random 为什么还需要 ThreadLocalRandom&#xff1f;正文Random 是使用最广泛的随机数生成工具了&#xff0c;即使连 Math.random() 的底层…

Linux Debian11使用国内源安装Podman环境

一、Podman简介 Podman 是一个开源的容器运行时项目&#xff0c;可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能。正如前面提到的那样&#xff0c;它不需要在你的系统上运行任何守护进程&#xff0c;并且它也可以在没有 root 权限的情况下运行。 Podman 可…

二叉搜索树中第k大元素_二叉搜索树中第K个最小元素

二叉搜索树中第k大元素Problem statement: 问题陈述&#xff1a; Find the k-th smallest element in a given binary search tree (BST). 在给定的二进制搜索树(BST)中找到第k个最小的元素。 Example: 例&#xff1a; K4Kth smallest element in the above binary tree is:…

阿里巴巴Java开发手册建议设置HashMap的初始容量,但设置多少合适呢?

作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;集合是Java开发日常开发中经常会使用到的&#xff0c;而作为一种典型的K-V结构的数据结构&#xff0c;HashMap对于Java开发者一定不陌生。关于HashMap&#xff0c;很多人都对他有一些基本的了解&…

面向.Net程序员的dump分析

背景 Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。在 Windows 系统上&#xff0c; dump 文件分为内核 dump 和用户态 dump 两种。前者一般用来分析内核相关的问题&#xff0c;比如驱动程序&#xff1b;后者一般用来分析用户态程序的问题。 一般…

Linux Debian利用Dockefile将Python的py文件项目代码打包为Docker Podman镜像

1.创建PyCharm工程 使用PyCharm创建testHelloWorld工程&#xff0c;如下图所示&#xff1a; 2.选择本项目下的Python解释器 通过File -> Setting…选择解释器为本工程下的Python解释器。 【备注&#xff1a;一定要将项目python环境依赖存至本项目下&#xff0c;默认依赖本…

Java14发布!Switch竟如此简单?Lombok也不需要了?来用Idea搭建Java14吧!​

Java 14 在 2020.3.17 日发布正式版了&#xff0c;但现在很多公司还在使用 Java 7 或 Java 8&#xff0c;每当看到 Java 又发布新版本心里就慌得一匹。不过此版本并不是 LTS (长期支持版) 版本&#xff0c;所以不要慌&#xff0c;我们先来了解一下好了&#xff0c;等 LTS 版本发…

PyCharm更换pip源为国内源、模块安装、PyCharm依赖包导入导出教程

一、更换pip为国内源 1.使用PyCharm创建一个工程 2.通过File -> Setting…选择解释器为本工程下的Python解释器。 3.单击下图中添加“”&#xff0c; 4.单击下图中的“Manage Repositories”按钮&#xff0c; 6.目前国内靠谱的 pip 镜像源有&#xff1a; - 清华&#xff1…

Java14来了!Switch竟如此简单?Lombok也不需要了?来用Idea搭建Java14吧!

Java 14 在 2020.3.17 日发布正式版了&#xff0c;但现在很多公司还在使用 Java 7 或 Java 8&#xff0c;每当看到 Java 又发布新版本心里就慌得一匹。不过此版本并不是 LTS (长期支持版) 版本&#xff0c;所以不要慌&#xff0c;我们先来了解一下好了&#xff0c;等 LTS 版本发…