【Redis】之Geo
概述
Geo就是Geolocation的简写形式,代表地理坐标。在Redis中,构造了能够存储地址坐标信息的一种数据结构,帮助我们根据经纬度来检索数据。
命令行操作方法
GEOADD
可以用来添加一个或者多个地理坐标。


GEODIST
返回一个key中两个成员之间的距离。


GEOHASH
将指定member的坐标转为哈希字符串形式返回。


GEOPOS
返回指定member的坐标。


GEORADIUS
指定圆心、半径,找到该圆内包含的member。

GEOSEARCH
在指定范围内搜索member。最新的一个命令,可以指定中心点的经纬度,也可以使用member;并且还可以指定搜索范围是圆形还是正方形。

StringRedisTemplate操作方法
add
用于添加地理坐标。

@Resourceprivate StringRedisTemplate stringRedisTemplate;@Testpublic void test(){Point point = new Point(112.653652,37.809874);Long add = this.stringRedisTemplate.opsForGeo().add("ShanXi", point, "SXU");System.out.println(add);}
radius
用来查找坐标

@Resourceprivate StringRedisTemplate stringRedisTemplate;@Test void test() {// 中心点Point point = new Point(112.617734,37.797128);// 半径Distance radius = new Distance(100, RedisGeoCommands.DistanceUnit.KILOMETERS);// 由中心点和半径组成的圆圈Circle circle = new Circle(point, radius);// 获取值之后要带回来的参数RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance() // 包含距离.includeCoordinates() // 包含坐标.sortAscending(); // 升序// 进行查询GeoResults<RedisGeoCommands.GeoLocation<String>> search =this.stringRedisTemplate.opsForGeo().radius("ShanXi", circle, args);List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = search.getContent();if(content == null || content.isEmpty()) {System.out.println("没有数据");}for (GeoResult<RedisGeoCommands.GeoLocation<String>> geoLocationGeoResult : content) {// 输出距离System.out.println("距离:" + geoLocationGeoResult.getDistance());RedisGeoCommands.GeoLocation<String> locationGeoResultContent = geoLocationGeoResult.getContent();// 输出名称System.out.println("member:" + locationGeoResultContent.getName());// 输出坐标System.out.println("坐标" + locationGeoResultContent.getPoint());}}
search
和radius方法类似,只不过search还可以查找矩形范围之内的坐标。

remove
删除操作

@Resourceprivate StringRedisTemplate stringRedisTemplate;@Test void test() {Long remove = this.stringRedisTemplate.opsForGeo().remove("ShanXi", "TaiYuanXueYuan");System.out.println(remove);}
distance
查看两个地理位置之间的直线距离

@Resourceprivate StringRedisTemplate stringRedisTemplate;@Test void test() {Distance distance = this.stringRedisTemplate.opsForGeo().distance("ShanXi", "SXU", "ZonBei");System.out.println(distance);}
代码示例
需求:山西所有高校建立之后,都会把自己的位置上传到某信息平台,并且还会查询距离自己学校30公里之内的其他学校。当学校换位置之后,就会删除当前信息。
基础配置
@RestController
@RequestMapping("/school")
public class SchoolController {@Resourceprivate SchoolService schoolService;}
@Service
public class SchoolService extends ServiceImpl<SchoolMapper, School> {@Resourceprivate StringRedisTemplate stringRedisTemplate;}
public interface SchoolMapper extends BaseMapper<School> {
}
@Data
public class School {// 学校idprivate Integer id;// 学校名private String name;// 经度private BigDecimal longitude;// 纬度private BigDecimal latitude;}
上传位置信息
public String add(School school) {// TODO 更新信息到数据库boolean save = this.save(school);// TODO 判断是否更新成功if(save) {// TODO 封装位置信息Point point = new Point(school.getLongitude().doubleValue(), school.getLatitude().doubleValue());// TODO 存入数据库this.stringRedisTemplate.opsForGeo().add("GEO:SCHOOL", point, school.getName());}return "成功";}
查询附近学校
public void queryMessage() {// 距离Distance distance = new Distance(30, RedisGeoCommands.DistanceUnit.KILOMETERS);// 参数RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance() // 包含距离.includeCoordinates() // 包含坐标.sortDescending(); // 降序// 开始查找GeoResults<RedisGeoCommands.GeoLocation<String>> results = this.stringRedisTemplate.opsForGeo().radius("GEO:SCHOOL", "SXU", distance, args);List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = results.getContent();// 输出结果for (GeoResult<RedisGeoCommands.GeoLocation<String>> geoLocationGeoResult : content) {System.out.println("距离山西大学30公里之内大学的名称:" + geoLocationGeoResult.getContent().getName());System.out.println("距离山西大学30公里之内大学的坐标:" + geoLocationGeoResult.getContent().getPoint());System.out.println("距离山西大学30公里之内大学的距离:" + geoLocationGeoResult.getDistance());}}
删除位置信息
public boolean remove(String name) {LambdaQueryWrapper<School> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.eq(School::getName, name);boolean subtract = this.remove(lambdaQueryWrapper);if(!subtract) {return false;}Long remove = this.stringRedisTemplate.opsForGeo().remove("GEO:SCHOOL", name);return remove != null && remove == 1;}
相关文章:
【Redis】之Geo
概述 Geo就是Geolocation的简写形式,代表地理坐标。在Redis中,构造了能够存储地址坐标信息的一种数据结构,帮助我们根据经纬度来检索数据。 命令行操作方法 GEOADD 可以用来添加一个或者多个地理坐标。 GEODIST 返回一个key中两个成员之…...
常用的k8s容器网络模式有哪些?
常用的k8s容器网络模式包括Bridge模式、Host模式、Overlay模式、Flannel模式、CNI(ContainerNetworkInterface)模式。K8s的容器网络模式多种多样,每种模式都有其特点和适用场景。Bridge模式适用于简单的容器通信场景;Host模式适用…...
4位整数的数位和
输入一个4位数的整数,求其各数位上的数字之和。 输入格式: 输入在一行中给出1个4位的正整数n。 输出格式: 在一行中输出n的各数位上的数字之和。 输入样例: 1234输出样例: 10 代码如下: #include<stdio.h> int main() {int n;int a,b,c,d;scanf(&…...
XHTML学习
XHTML学习 1.XHTML 简介2.XHTML - 元素标准3.XHTML - 属性标准 1.XHTML 简介 XHTML是一个严格遵循 XML语法规则的 HTML 标准。它是 HTML4 的一种重构版本,结合了 HTML 的灵活性和 XML 的严格性,如今XHTML已经得到了所有主流浏览器的支持 与 HTML 相比最…...
KTH7823——16 位高精度低延时霍尔磁编码器可编程 ABZ 和 PWM 输出模式角度传感器
KTH7823 是一款高精度绝对角度霍尔传感器芯片,最高 16 位分辨率绝对角度输出,可 实现在轴向和离轴场合下的无接触式磁场角度测量。不论转速范围在 0-120000rpm 之间, KTH7823 都能快速准确地输出角度信息,适用于需要精准角…...
JDBC笔记
文章目录 准备MySQL数据的建立和建表 idea 建工程和模块设置属性配置文件编写JDBC代码URL的设置JDBC 代码配置文件 准备MySQL 数据的建立和建表 idea 建工程和模块 设置属性配置文件 编写JDBC代码 URL的设置 JDBC 代码 package com.yanyu;import java.sql.*; import java.util…...
小众语言ruby在苹果中的初步应用
前言 感觉Ruby在苹果系统中充当一种脚本语言来使用。 1、直接输入ruby没有反应 2、可显示结果的命令 ruby -e "puts Goodbye, cruel world!" 效果如下图: 说明苹果系统中ruby已经安装完毕,或者就是自带的。 3、编辑运行第一个ruby程序 输入…...
Nature: 一种基于宏基因组序列空间生成无参考的蛋白质家族的计算方法
通过全局宏基因组学揭示功能性暗物质 Unraveling the functional dark matter through global metagenomics Article, 2023-10-11 Nature [IF: 64.8] DOI: https://doi.org/10.1038/s41586-023-06583-7 原文链接:https://www.nature.com/articles/s41586-023-06…...
play-with-docker使用指南
Play-with-Docker(PWD)是一个在线平台,提供免费的 Docker 实验环境。它允许用户在浏览器中创建和管理 Docker 容器,适合学习和实验。国内访问需要借助于魔法工具,否则可能无法访问哦。 网站地址:https://labs.play-with-docker.com/ 一、登录play-with-docker 点击页面上…...
常见中间件漏洞靶场(tomcat)
1.CVE-2017-12615 开启环境 查看端口 查看IP 在哥斯拉里生成一个木马 访问页面修改文件后缀和文件内容 放包拿去连接 2.后台弱⼝令部署war包 打开环境 将前边的1.jsp压缩成1.zip然后改名为1.war 访问页面进行上传 在拿去连接 3.CVE-2020-1938 打开环境 访问一下 来到kali …...
一文读懂SpringCLoud
一、前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)… 所以,这篇主要来讲讲SpringCloud的一些基础的知识。(我就是现学现卖了,主要当做我学习SpringCloud的笔记吧&…...
tcpdump使用方法
一、centos上可以采用下面的命令进行安装。 yum install tcpdump 二、实例: 1、监视指定网络接口的数据包 即监听指定网卡的数据包,若不指定网卡,默认tcpdump只会监视第一个网络接口。如监听 eth0网卡,如下: tcpd…...
密码字典txt python密码字典代码
由于生成的密码数量非常庞大,这个过程可能需要非常长的时间来完成,并且会占用大量的磁盘空间。 链接: 密码字典下载地址610.4M 提取码: w8bi...
ubuntu安装emqx
目录 1.预先下载好emqx压缩包 2.使用tar命令解压 3.进入bin目录 5.放开访问端口18083 6.从通过ip地址访问emqx后台 7.默认用户名密码为admin/public 8.登录后台 9.资源包绑定在此博文可自取 1.预先下载好emqx压缩包 2.使用tar命令解压 sudo tar -xzvf emqx-5.0.8-el8-…...
F28335 时钟及控制系统
1 F28335 系统时钟来源 1.1 振荡器OSC与锁相环PLL 时钟信号对于DSP来说是非常重要的,它为DSP工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。DSP 属于数字信号处理器, 它正常工作也必须为其提供时钟信号。那么这个时钟…...
数据结构和算法之线性结构
原文出处:数据结构和算法之线性结构 关注码农爱刷题,看更多技术文章!!! 线性结构是一种逻辑结构,是我们编程开发工作应用最广泛的数据结构之一。线性结构是包含n个相同性质数据元素的有限序列。它的基本特征是&…...
3. 轴指令(omron 机器自动化控制器)——>MC_MoveAbsolute
机器自动化控制器——第三章 轴指令 4 MC_MoveAbsolute变量▶输入变量▶输入输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 示例程序1▶参数设定▶动作示例▶梯形图▶结构文本(ST) 示例程序2▶参数设定▶动作示例▶梯形图▶结构文…...
ai 回答HFS是什么 HTTP的文件服务器是什么
HFS(HTTP File Server)是一个基于HTTP协议的文件服务器软件,它允许用户通过浏览器访问和共享计算机上的文件。HFS的特点包括界面简洁直观、易于安装和配置、支持虚拟文件系统、多种权限设置等。用户可以轻松地在本地网络或互联网上共享文件和…...
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核启动】
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…...
若依笔记(六):前后端token鉴权体系
文章目录 前端/login后端生成token后端拦截前端的动态路由简单总结下若依的前后端token鉴权体系流程: 1、前端是通过/login接口来获取jwt-token的,jwt的配置在后端的application.yml中 2、后端处理/login请求时先检验redis中验证码然后使用spring-security内部机制(过滤链)…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

