SpringBoot依赖之Spring Data Redis 实现地理坐标(Geospatial)

Spring Boot 项目中使用 Spring Data Redis 实现地理坐标(Geospatial)

概念

Spring Data Redis (Access+Driver)
  • 依赖名称: Spring Data Redis (Access+Driver)
  • 功能描述: Advanced and thread-safe Java Redis client for synchronous, asynchronous, and reactive usage. Supports Cluster, Sentinel, Pipelining, Auto-Reconnect, Codecs and much more.
  • 中文释义:用于同步、异步和反应式使用的高级且线程安全的 Java Redis 客户端。支持集群、哨兵、管道、自动重新连接、编解码器等。

项目学习代码地址

操作演示:

Spring Boot 项目中使用 Spring Data Redis 实现地理坐标(Geospatial)

接下来我们演示在 Spring Boot 项目中使用 Spring Data Redis 实现(Geospatial)操作,我们可以在之前的项目代码基础上扩展 Redis 服务类和控制器类,以支持对 Redis 列表的常见操作。以下是具体的实现步骤。

以下是具体的实现步骤。

1. 更新 Redis 服务类

RedisService 类中添加列表相关的方法。

package com.dependencies.springdataredis;import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class RedisService {private final RedisTemplate<String, Object> redisTemplate;private final GeoOperations<String, Object> geoOperations;public RedisService(RedisTemplate<String, Object> redisTemplate) {this.redisTemplate = redisTemplate;this.geoOperations = redisTemplate.opsForGeo();}private static final String GEO_KEY = "locations";// 添加地理坐标public void addLocation(String member, double longitude, double latitude) {geoOperations.add(GEO_KEY, new Point(longitude, latitude), member);}// 根据坐标查询附近的地点public List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> getNearbyLocations(double longitude, double latitude, double radius) {Circle within = new Circle(new Point(longitude, latitude), new Distance(radius, RedisGeoCommands.DistanceUnit.KILOMETERS));return geoOperations.radius(GEO_KEY, within).getContent();}// 获取两地之间的距离public Distance getDistance(String member1, String member2) {return geoOperations.distance(GEO_KEY, member1, member2, RedisGeoCommands.DistanceUnit.KILOMETERS);}
}
2. 更新控制器类

RedisController 中添加处理HyperLogLog操作的端点。

package com.dependencies.springdataredis;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @author zhizhou   2024/8/20 12:02*/
@RestController
public class RedisController {private final RedisService redisService;public RedisController(RedisService redisService) {this.redisService = redisService;}@GetMapping("/add-location")public String addLocation(@RequestParam String member, @RequestParam double longitude, @RequestParam double latitude) {redisService.addLocation(member, longitude, latitude);return "Location added.";}@GetMapping("/nearby")public List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> getNearbyLocations(@RequestParam double longitude, @RequestParam double latitude, @RequestParam double radius) {return redisService.getNearbyLocations(longitude, latitude, radius);}@GetMapping("/distance")public Distance getDistance(@RequestParam String member1, @RequestParam String member2) {return redisService.getDistance(member1, member2);}
}
3. 验证测试:

我们启动项目以后,就通过以下的额 URL 测试 Redis 列表的功能:

Geospatial 操作:

120.209000,30.247100

  • 添加地理位置
    http://localhost:8080/add-location?member=location1&longitude=120.209000&latitude=30.247100
  • 查询附近的地点
    http://localhost:8080/nearby?longitude=120.209000&latitude=30.247100&radius=10
  • 获取两地之间的距离
    http://localhost:8080/distance?member1=location1&member2=location2

操作结果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 总结

Geospatial(地理空间)

Redis 提供了专门的命令来处理地理位置和半径查询,可以存储地理坐标,并计算给定半径内的元素。

使用场景: 地理位置服务,可以用于实现地理位置相关的功能,比如查询附近的商户、外卖、用户位置服务等。

2023年面试某电气公司,一家准备做充电桩的公司,被问到——设计一个服务,帮用户找到最近的空闲的充电桩,当时回答的就是这个。研究研究还是蛮有意思的。复杂的业务场景还是需要具体场景具体分析,目前这个类型使用场景还是挺多的,如果需要更复杂的操作,可以进一步扩展这些功能,结合其他技术如 Elasticsearch 或 Cassandra,实现更高效和更复杂的地理信息处理系统。

可以关注我,一起学习,一起为程序员职业生涯蓄能。

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

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

相关文章

Sqlmap

Python 语言编写的开源SQL注入检测、利用工具丰富的特性、参数众多、强大的检测引擎指纹发现、脱裤、OS控制、RCE顺便发现XSS漏洞必备参数、HTTP头均可注入 SQL注入 与编程语言、数据库无关问题在程序代码 检测漏洞 ’1 and 1# 1 and 12# 1’ or 11# 1’ or 12#select [pas…

React+Vis.js(02):vis.js设置节点样式

文章目录 1、修改vis.js的节点和关系颜色2、修改vis.js节点的字体颜色2.1 统一设置节点字体颜色2.2 自定义某个节点的字体颜色3、设置vis.js节点的边框颜色和宽度3.1 设置单个节点3.2 统一设置1、修改vis.js的节点和关系颜色 在vis.js中,可以通过color属性,来给node节点添加…

如何制作统信UOS启动盘?

如何制作统信UOS启动盘&#xff1f; 一、下载UOS系统安装镜像二、在UOS系统环境下制作启动盘步骤一&#xff1a;准备U盘步骤二&#xff1a;打开启动盘制作工具步骤三&#xff1a;选择ISO镜像文件步骤四&#xff1a;选择安装介质并格式化步骤五&#xff1a;等待制作完成 三、在W…

Redis 技术详解

一、Redis 基础 &#xff08;一&#xff09;为什么使用 Redis 速度快&#xff0c;因为数据存在内存中&#xff0c;类似于 HashMap&#xff0c;查找和操作的时间复杂度都是 O(1)。支持丰富数据类型&#xff0c;支持 string、list、set、Zset、hash 等。支持事务&#xff0c;操…

Elasticsearch简述

Elasticsearch简述 Elasticsearch产品介绍 Elasticsearch是一个基于Apache Lucene的开源的分布式搜索和分析引擎,设计用于云计算中,能够快速处理大量数据。它能够近实时地进行复杂的查询,并且可以用于全文检索、结构化搜索以及分析。Elasticsearch具有以下特性: 分布式搜索…

2024前端面试题-网络篇

1.跨域问题 同源策略&#xff1a;需要协议、域名、端口号相同跨域原因&#xff1a;不符合同源策略便会产生跨域问题解决跨域&#xff1a;JSONP、配置代理、通过CORS解决 2.RPC和HTTP的区别 主要区别是序列化和反序列化&#xff0c;RPC通过二进制高效传输&#xff0c;HTTP是j…

AScript 的UI asui模板的导入

两种方案&#xff1a; 第一种直接在web端&#xff0c;右击UI文件夹 第二种在pycharm&#xff0c;也是右击UI文件夹 调用UI&#xff0c;在init类中直接调用即可

Transformer微调实战:通过低秩分解(LoRA)对T5模型进行微调(LoRA Fine Tune)

scient scient一个用python实现科学计算相关算法的包&#xff0c;包括自然语言、图像、神经网络、优化算法、机器学习、图计算等模块。 scient源码和编译安装包可以在Python package index获取。 The source code and binary installers for the latest released version ar…

Aria2安装和使用-Mac版

起因是需要网盘下载&#xff0c;无奈限速很烦&#xff0c;查找很多方案后&#xff0c;最终决定使用Aria2 Tampermonkey。 其中Aria2是一款开源轻量的下载软件&#xff0c;简单来说就是可以通过URL直接下载。 Tampermonkey则是一款插件&#xff0c;我这里是.crx结尾的谷歌插件…

文件IO函数:open/close,read/write,lseek

open和close函数 C语言中的文件IO操作需要使用到open()函数和close()函数来打开和关闭文件。 open()函数的原型如下&#xff1a; int open(const char *pathname, int flags); int open(const char *filename, int flags,mode_t mode);其中&#xff0c;filename表示要打开…

CSS中flex:1是什么属性

flex: 1 是 CSS 中的一个简写属性&#xff0c;用于设置 Flex 项目的灵活伸缩比例&#xff08;flex-grow&#xff09;、收缩比例&#xff08;flex-shrink&#xff09;以及基础大小&#xff08;flex-basis&#xff09;。具体来说&#xff0c;flex: 1 实际上是以下三个属性的简写&…

性能优化理论篇 | swap area是个什么东西

我们知道每台计算机的内存&#xff08;RAM&#xff09;都是有限的&#xff0c;而我们的应用程序需要加载到内存才能被运行&#xff0c;如果一台机器运行多个应用程序时&#xff0c;内存可能会耗尽。Linux 系统中的“交换空间&#xff08;也称为交换分区&#xff09;”可以帮助缓…

c语言利用if嵌套语句制作日程表查询程序

c语言里if嵌套语法是 if(表达式) { if(表达式) 语句1 else 语句2 } else if(表达式) 语句3 else 语句4 ) 这里有一个日程是星期一开会&#xff0c;星期二到星期五上班&#xff0c;星球六去长城&#xff0c;星期天去故宫&#xff0c;输入一个星期几&#xff0c;会…

Google Play开发者账号地址验证难题?这些经验或许能帮到你

目前&#xff0c;想要把应用顺利上架到 Google Play&#xff0c;已经不像以前那么简单了&#xff0c;主要是开发者需要应对 Google 日益严格的审核机制。其中&#xff0c;账号验证的地址验证绝对是让很多人头疼的一个环节。 今天就来给大家分享一些真实的经验和干货&#xff0c…

IA实验:静态路由(1基础版)

实验拓扑&#xff1a; 实验要求&#xff1a; 1.实现全网通 实验思路&#xff1a; 1.给各个设备配置好端口的IP地址并且划分广播域&#xff0c;暂定网段为&#xff1a; 192.168.1.0 192.168.2.0 192.168.3.0 2.pc1去ping各网段的设备以及端口&#xff0c;发现3.0网段以及2.2网…

数控单主轴走心机多少钱

单主轴走心机的价格因品牌、型号、性能及配置等因素而异&#xff0c;因此无法给出一个具体的统一价格。一般来说&#xff0c;单主轴走心机的价格在数万元到数十万元不等。 市场上某些品牌的单主轴走心机价格可能在十几万之间不等&#xff0c;而另一些高端型号或定制产品的价格可…

Bigtop 从0开始(上)

本文作者&#xff1a;蔡佳良 原文阅读&#xff1a;【巨人肩膀社区博客分享】Bigtop 从0开始 BigTop的应用场景&#xff1a; 1. BigTop通过提供预配置的Docker镜像&#xff0c;极大简化了在不同操作系统上编译大数据组件的rpm或deb包的过程&#xff0c;使之变得快捷且高效。 …

苹果上架没有iphone、没有ipad也可以生成截屏

使用flutter、uniapp或其他跨平台框架开发ios的APP&#xff0c;上架的时候都会遇到一个问题&#xff0c;上架的时候需要各种尺寸的设备来做ios截屏。 比如目前最新的要求是&#xff0c;iphone需要三种不同尺寸的设备的截屏&#xff0c;假如支持ipad则还需要使用ipad 2代和ipad…

从0开始搭建个人博客《第十一期:优化网站访问速度》

目录 一、背景说明 二、Nginx性能优化 &#xff08;一&#xff09;文件句柄 1.系统全局性修改和用户局部性修改 2.进程局部性修改 &#xff08;二&#xff09;CPU亲和配置 1.设置工作进程数 2.设置连接数 &#xff08;三&#xff09;事件处理模型优化 &#xff08;四&…

MySql 高阶 概念(了解即可)

mysql 分为4层结构&#xff1a; 连接层&#xff1a;负责处理链接&#xff0c;鉴权&#xff0c;安全。 服务层&#xff1a;负责sql接口&#xff0c;sql分析&#xff0c;sql优化&#xff0c;sql缓存。 引擎层&#xff1a;负责执行服务层的操作&#xff0c;不同的引擎拥有不同的特…