打卡小达人之路:Spring Boot与Redis GEO实现商户附近查询
在当今社会,定位服务已经成为了各种应用的重要组成部分,比如地图、打车、美食等应用。如何在应用中实现高效的附近商户搜索功能呢?传统的做法是将商户的经纬度信息存储在关系型数据库中,然后使用SQL查询语句实现附近商户搜索功能。但是,这种做法存在许多问题,比如查询效率低、无法支持大规模数据、不易扩展等。因此,今天我们来介绍一种新的解决方案——使用SpringBoot整合Redis GEO实现附近商户功能。

Redis GEO概述
Redis是一种内存型的key-value数据库,支持多种数据结构。其中,GEO是Redis中的一个地理位置数据类型,它提供了一些强大的地理位置相关的函数,可以用来实现地理位置搜索、附近商户搜索等功能。
Redis GEO通过将地理位置数据转换为经度和纬度的数值来表示,然后将这些数值存储在一个有序集合中。每个有序集合的元素都有一个地理位置属性,可以使用GEOADD命令将元素的地理位置属性加入有序集合中。接着,可以使用GEODIST命令计算两个元素之间的地理距离,或者使用GEORADIUS命令实现附近商户搜索。
Redis GEO命令
在实现商户附近查询功能时,我们使用了Redis GEO命令。Redis GEO命令是Redis的一种地理位置命令,主要用于地理位置相关的查询和计算。在Redis 3.2及以上版本中,Redis提供了以下5个GEO命令:
- GEOADD:将指定的地理位置信息添加到指定的键上。
- GEOPOS:获取指定位置的经度和纬度。
- GEODIST:计算两个位置之间的距离。
- GEORADIUS:根据给定的经纬度坐标获取指定范围内的位置信息。
- GEORADIUSBYMEMBER:根据给定的位置名称获取指定范围内的位置信息。
其中,GEORADIUS和GEORADIUSBYMEMBER命令用于实现商户附近查询功能。
Spring Boot整合Redis GEO实现附近商户功能
下面,我们将介绍如何使用SpringBoot整合Redis GEO实现附近商户功能。
1. 配置Redis连接
首先,我们需要在Spring Boot中配置Redis连接。可以通过application.properties文件进行配置,例如:
spring.redis.host=localhost
spring.redis.port=6379
这里的host和port需要根据实际情况进行修改。
2. 添加RedisTemplate Bean
接着,我们需要添加RedisTemplate Bean,用于操作Redis中的GEO数据类型。可以通过以下代码添加RedisTemplate Bean:
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());template.afterPropertiesSet();return template;
}
这里我们使用了JSON序列化器来将对象转换为JSON格式进行存储,可以根据实际情况进行调整。
3. 存储商户信息
接着,我们需要将商户的经纬度信息存储到Redis中。可以使用GEOADD命令将商户信息添加到Redis的GEO数据类型中,例如:
// 添加商户信息到Redis中
geoOperations.add("merchants", new Point(116.48105, 39.996794), "1");
geoOperations.add("merchants", new Point(116.481499, 39.99704), "
4. 搜索附近商户
现在,我们已经将商户的经纬度信息存储到Redis中了,接下来我们需要实现附近商户搜索功能。可以使用GEORADIUS命令搜索指定位置附近的商户,例如:
// 搜索附近商户
GeoResults<GeoLocation<String>> geoResults = geoOperations.radius("merchants",new Circle(new Point(116.48105, 39.996794), new Distance(2, Metrics.KILOMETERS)));
List<GeoLocation<String>> geoLocations = geoResults.getContent().stream().map(GeoResult::getContent).collect(Collectors.toList());
这里我们搜索以(116.48105, 39.996794)为中心,半径为2公里范围内的商户。搜索结果为GeoResults类型,可以通过getContent方法获取搜索到的商户信息。
5. 计算商户距离
如果需要在搜索结果中显示商户与指定位置的距离,可以使用GEODIST命令计算商户与指定位置的距离,例如:
// 计算商户距离
double distance = geoOperations.distance("merchants", "1", "2", Metrics.KILOMETERS);
这里我们计算商户1与商户2之间的距离,单位为公里。
总结
通过以上步骤,我们已经成功实现了Spring Boot整合Redis GEO实现附近商户搜索功能。相比传统的数据库查询方式,使用Redis GEO可以实现更高效的附近商户搜索,而且还能够支持大规模数据、易于扩展。希望这篇文章对大家有所帮助,谢谢大家的阅读!

相关文章:
打卡小达人之路:Spring Boot与Redis GEO实现商户附近查询
在当今社会,定位服务已经成为了各种应用的重要组成部分,比如地图、打车、美食等应用。如何在应用中实现高效的附近商户搜索功能呢?传统的做法是将商户的经纬度信息存储在关系型数据库中,然后使用SQL查询语句实现附近商户搜索功能。…...
Apache HTTP Server <2.4.56 mod_proxy_uwsgi 模块存在请求走私漏洞(CVE-2023-27522)
漏洞描述 Apache HTTP Server 是一个Web服务器软件。 该项目受影响版本存在请求走私漏洞。由于mod_proxy_uwsgi.c 中uwsgi_response方法对于源响应头缺少检查,当apache启用mod_proxy_uwsgi后,攻击者可利用过长的源响应头等迫使应转发到客户端的响应被截…...
JUC并发编程设计模式
一、保护性暂停 1.1 定义 即Guarded Suspension,用在一个线程等待另一 个线程的执行结果 要点 ● 有一个结果需要从一个线程传递到另一 个线程,让他们关联同一一个GuardedObject ● 如果有结果不断从一个线程到另一个线程那么可以使用消息队列(生产者…...
HTTPS加密解析
日升时奋斗,日落时自省 目录 1、加密解释 2、对称加密 3、非对称加密 4、证书 HTTPS(HyperText Transfer Protocol over Secure Socket Layer)也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层 HTTP协议内容都是按…...
Python每日一练(20230309)
目录 1. 删除有序数组中的重复项 ★ 2. 二叉树的最小深度 ★★ 3. 只出现一次的数字 II ★★ 🌟 每日一练刷题专栏 C/C 每日一练 专栏 Python 每日一练 专栏 1. 删除有序数组中的重复项 给你一个有序数组 nums ,请你原地删除重复出现的元素…...
哈希表题目:数组的度
文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目 标题和出处 标题:数组的度 出处:697. 数组的度 难度 4 级 题目描述 要求 给定一个非空且只包含非负数的整数数组 nums\texttt{nums}nums,数组的…...
初识rollup 打包、配置vue脚手架
rollup javascript 代码打包器,它使用了 es6 新标准代码模块格式。 特点: 面向未来,拥抱 es 新标准,支持标准化模块导入、导出等新语法。tree shaking 静态分析导入的代码。排除未实际引用的内容兼容现有的 commonJS 模块&#…...
软考网络工程师证书有用吗?
当然有用,但是拿到网络工程师证书的前提是对你自己今后的职业发展有帮助,用得到才能对你而言发挥它最大的好处。软考证书的具体用处:1.纳入我国高校人才培养和教学体系目前,软考已经被纳入高校人才培养和教学体系。在很多高校中&a…...
postgresql 自动备份 bat实现
postgres数据据备分,用cmd命令有些烦,写了个bat实现 BAT脚本中常用的注释命令有rem、@rem和:: rem、@rem和::用法都很简单,直接在命令后加上要注释的语句即可。例如下图,语言前加了rem,运行BAT时就会自动忽略这个句子。需要注释多行时,每行前面都要加上rem、@rem和::。…...
gdb:在命令行中会莫名暂停;detach-on-fork
这个没有捕获到断点的原因是,可能是多线程的问题,需要设置: set detach-on-fork off On Linux, if you want to debug both the parent and child processes, use the command: set detach-on-fork on/off on 默认设置,gdb会放弃子线程(或者父线程,受follow-fork-mode的…...
【3.9】RedisAOF日志、字符串、操作系统进程管理
4. 进程管理 进程、线程基础知识 什么是进程 我们编写的代码只是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着 CPU 会执行程序中的每一条指令,…...
安装mayavi的成功步骤
这篇文章是python 3.6版本,windows系统下的安装,其他python版本应该也可以,下载对应的包即可。 一定不要直接pip install mayavi,这个玩意儿对vtk的版本有要求。 下载whl包 搞了很久不行,咱也别费那个劲了࿰…...
vue+echarts.js 实现中国地图——根据数值表示省份的深浅——技能提升
最近在写后台管理系统,遇到一个需求就是 中国地图根据数值 展示深浅颜色。 效果图如下: 直接上代码: 1.html部分 <div id"Map"></div>2.css部分——一定要设置尺寸 #Map {width: 100%;height: 400px; }3.js部分 …...
[oeasy]python0104_指示灯_显示_LED_辉光管_霓虹灯
编码进化 回忆上次内容 x86、arm、riscv等基础架构 都是二进制的包括各种数据、指令 但是我们接触到的东西 都是屏幕显示出来的字符 计算机 显示出来的 一个个具体的字型 计算机中用来展示的字型 究竟是 如何进化的 呢?🤔🤔 模拟电路时…...
Easy Deep Learning——卷积层
为什么需要卷积层,深度学习中的卷积是什么? 在介绍卷积之前,先引入一个场景 假设您在草地上漫步,手里拿着一个尺子,想要测量草地上某些物体的大小,比如一片叶子。但是叶子的形状各异,并且草地非…...
深入分析@Bean源码
文章目录一、源码时序图二、源码解析1. 运行案例程序启动类2. 解析AnnotationConfigApplicationContext类的AnnotationConfigApplicationContext(Class<?>... componentClasses)构造方法3. 解析AbstractApplicationContext类的refresh()方法4. 解析AbstractApplicationC…...
Web Components学习(1)
一、什么是web components 开发项目的时候为什么不手写原生 JS,而是要用现如今非常流行的前端框架,原因有很多,例如: 良好的生态数据驱动试图模块化组件化等 Web Components 就是为了解决“组件化”而诞生的,它是浏…...
Element-UI实现复杂table表格结构
Element-UI组件el-table用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作。将使用到以下两项,来完成今天demo演示:多级表头:数据结构比较复杂的时候,可使用多级表头来展现数据的层次关系。合…...
Azure AD 与 AWS 单一帐户SSO访问集成,超详细讲解,包括解决可能出现的错误问题
本教程介绍如何将 AWS Single-Account Access 与 Azure Active Directory (Azure AD) 相集成。 将 AWS Single-Account Access 与 Azure AD 集成后,可以: 在 Azure AD 中控制谁有权访问 AWS Single-Account Access。让用户使用其 Azure AD 帐户自动登录…...
lvgl 笔记 按钮部件 (lv_btn) 和 开关部件 (lv_switch)
按钮基础使用方法: lv_btn 和 lb_obj 使用方法一样,只是外表并不相同,基础创建方法只需一行代码。 lv_obj_t* btn lv_btn_create(lv_scr_act()); 添加大小和位置: lv_obj_t* btn lv_btn_create(lv_scr_act()); lv_obj_set_s…...
Redis集群模式下如何高效模糊匹配Key?RedisTemplate+Scan全节点遍历实战
Redis集群环境下高效模糊匹配Key的工程实践 Redis作为高性能缓存数据库,在分布式系统中扮演着重要角色。当系统规模扩大,单节点Redis无法满足需求时,集群模式成为必然选择。但在集群环境下,如何高效地进行模糊Key匹配却成为开发者…...
每天20分钟值不值?淘宝任务自动化的取舍之道
每天20分钟值不值?淘宝任务自动化的取舍之道 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi 在数字生活时代…...
如何在树莓派上搭建Spotify Connect客户端:Raspotify完整安装配置指南
如何在树莓派上搭建Spotify Connect客户端:Raspotify完整安装配置指南 【免费下载链接】raspotify A Spotify Connect client that mostly Just Works™ 项目地址: https://gitcode.com/gh_mirrors/ra/raspotify 想要将你的树莓派变成专业的Spotify Connect音…...
革命性智能求职助手:AI驱动的多平台简历投递解决方案
革命性智能求职助手:AI驱动的多平台简历投递解决方案 【免费下载链接】get_jobs 💼【找工作最强助手】全平台自动投简历脚本:(boss、前程无忧、猎聘、拉勾、智联招聘) 项目地址: https://gitcode.com/gh_mirrors/ge/get_jobs 你是否还…...
从MATLAB到Python:脑网络连通性分析之PLI/wPLI的跨平台实现与结果对比
从MATLAB到Python:脑网络连通性分析之PLI/wPLI的跨平台实现与结果对比 神经科学研究中,脑网络连通性分析正成为理解认知功能与疾病机制的重要工具。其中,相位滞后指数(PLI)及其加权版本(wPLI)因…...
AnythingLLM文档处理革命:如何用统一接口解析20+文件格式构建智能知识库
AnythingLLM文档处理革命:如何用统一接口解析20文件格式构建智能知识库 【免费下载链接】anything-llm 这是一个全栈应用程序,可以将任何文档、资源(如网址链接、音频、视频)或内容片段转换为上下文,以便任何大语言模型…...
AHT20温湿度传感器在STM32上的应用:从数据采集到OLED显示
AHT20温湿度传感器在STM32上的实战应用:从数据采集到OLED可视化 在物联网和智能硬件开发中,环境数据的实时监测与可视化是基础却关键的一环。AHT20作为新一代数字温湿度传感器,以其高精度、低功耗和I2C接口的便捷性,成为STM32开发…...
Qwen3-0.6B-FP8实战:构建基于操作系统的命令行智能助手
Qwen3-0.6B-FP8实战:构建基于操作系统的命令行智能助手 你有没有过这样的经历?想用命令行完成一个任务,比如“找出所有昨天修改过的日志文件并压缩备份”,却记不清find命令那一长串复杂的参数,或者tar命令的语法又搞混…...
微信850协议实战:泡泡玛特小程序授权不掉线全流程解析(附源码)
微信850协议深度应用:构建高稳定小程序授权体系的技术实践 在移动互联网生态中,微信小程序已成为连接用户与服务的重要桥梁。对于开发者而言,如何确保授权流程的稳定性,特别是在需要长期维持登录状态的场景下,成为技术…...
【国家级智慧农场落地案例】:Python图像算法如何将番茄裂果识别准确率提升至98.7%?
第一章:国家级智慧农场落地背景与番茄裂果识别挑战近年来,国家《“十四五”推进农业农村现代化规划》明确提出加快数字技术与农业生产深度融合,推动建设一批国家级智慧农场示范项目。在华北、华东等核心蔬菜产区,规模化番茄种植基…...
