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

本文主要是介绍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,实现更高效和更复杂的地理信息处理系统。

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

这篇关于SpringBoot依赖之Spring Data Redis 实现地理坐标(Geospatial)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095461

相关文章

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例: