Redis Geo实现地理位置检索
📅 2026/7/19 4:51:42
👁️ 次浏览
做业务开发时我们经常遇到这类需求✅ 同城筛选附近门店、外卖骑手匹配✅ 社交APP附近的人、同城动态✅ 网约车就近派单、地理位置打卡面对这些地理位置检索场景无需引入笨重的专业GIS引擎Redis自带的GEO地理空间索引是一个轻量、高性能的方案。Redis GeoRedis Geo 没有创造新结构完全基于有序集合 Sorted SetZSet实现底层核心组合GeoHash 编码 Sorted Set 索引。简单来说就是把二维的经纬度坐标通过算法压缩成一维整数分值利用ZSet天然的排序、范围检索能力实现高效的地理位置查询。Key地理集合名如 stores:location 门店位置集合Member位置唯一标识店铺ID、用户ID、设备IDScore经纬度编码后的52位GeoHash整数排序、检索的核心GeoHash 编码GeoHash的核心价值将二维经纬度转化为可排序、可比对的一维字符串。相近的地理位置会拥有高度相似的编码前缀这也是“附近查询”能够高效实现的根本原因。GeoHash编码流程区间划分针对地球经度范围[-180, 180]与纬度范围[-90, 90]开展持续的二分操作二进制编码在每次二分过程中依据目标点所处区间左区间记为0右区间记为1生成对应的二进制位且经度与纬度的编码过程交替进行Base32编码将生成的二进制数据流按每5位为一组转换为Base32字符核心命令命令 作用GEOADD key longitude latitude member […] 添加一个或多个地理位置GEOPOS key member […] 获取指定成员的经纬度信息GEODIST key member1 member2 [unit] 计算两个成员之间的直线距离GEOHASH key member […] 获取成员对应的GeoHash编码主要用于调试场景GEOSEARCH key FROMMEMBER member BYRADIUS radius unit […] 以已存储的成员为中心检索指定圆形区域内的位置GEOSEARCH key FROMLONLAT lng lat BYRADIUS radius unit […] 以给定的经纬度为中心检索指定圆形区域内的位置GEOSEARCH key FROMLONLAT lng lat BYBOX width height unit […] 检索指定矩形区域内的位置GEORADIUS key FROMLONLAT lng lat BYBOX width height unit […] 检索指定矩形区域内的位置该命令已废弃实战演练实现「附近店铺」功能将店铺位置录入Redis将店铺的经纬度信息添加至Redis数据库GEOADD storeId:location 116.48 39.95 store:1001GEOADD storeId:location 116.50 39.96 store:1002GEOADD storeId:location 116.30 39.90 store:1003 该操作支持批量添加可一次性录入多个位置信息能有效提升操作性能。检索附近的店铺当用户A位于(116.48, 39.95)时若需查询5公里范围内的店铺可执行如下操作GEOSEARCH storeId:locationFROMLONLAT 116.48 39.95 \ # 以指定经纬度为中心BYRADIUS 5 km \ # 搜索半径5公里WITHDIST \ # 返回距离中心点的距离WITHCOORD \ # 返回目标的经纬度COUNT 20 ASC # 最多20条由近及远排序Redis 6.2 以下旧版本可使用以下命令GEORADIUS storeId:location 116.48 39.95 5 km WITHCOORDJava代码Servicepublic class LocationService {Autowiredprivate RedisTemplateString, String redisTemplate;private static final String GEO_KEY “storeId:location”;public void updateLocation(Long storeId, double lng, double lat) { // 先删旧位置再添加新位置 redisTemplate.opsForGeo().remove(GEO_KEY, storeId.toString()); redisTemplate.opsForGeo().add(GEO_KEY, new Point(lng, lat), storeId.toString()); } public GeoResultsRedisGeoCommands.GeoLocationString findNearby(double lng, double lat, double radius) { Circle circle new Circle(new Point(lng, lat), new Distance(radius, Metrics.KILOMETERS)); return redisTemplate.opsForGeo().radius(GEO_KEY, circle, RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs() .includeDistance() .includeCoordinates() .sortAscending() .limit(20));
1. STM32与I2C通信协议基础解析I2C(Inter-Integrated Circuit)是飞利浦半导体(现恩智浦)在1980年代开发的双线式串行通信协议。在STM32开发中,I2C因其简单的硬件连接和灵活的多设备管理能力,成为与EEPROM、…
📅 2026/7/19 4:51:42
1. 项目概述:为什么金融AI问答的合规是“生死线”?最近在帮几家金融科技公司做AI应用落地,感触最深的一点就是:技术实现可以很快,但合规落地往往是最慢、最磨人的那一步。特别是当你的应用涉及到直接面向用户提供金融信…
📅 2026/7/19 4:51:42
1. 项目概述:当C数组遇上动画很多刚接触C图形或游戏编程的朋友,一听到“动画”两个字,脑海里蹦出来的可能就是各种复杂的图形库、物理引擎,或者是一堆让人眼花缭乱的类继承关系。但今天,我想分享一个有点“复古”或者说…
📅 2026/7/19 4:51:42
1. 项目概述:这不是“又一个低代码教程”,而是一次真实可用的AI能力嵌入实践 “Building Your First AI App in Oracle APEX — For Free”这个标题里藏着三个被多数人忽略的关键信号: First (首次)、 in Oracle AP…
📅 2026/7/19 8:17:55
1. 项目概述与调试架构背景在嵌入式系统开发,尤其是基于ARM架构的复杂SoC(如TI的AM62L Sitara™处理器)开发中,调试能力是决定开发效率与深度的关键。当你的代码在某个多核异构系统中“跑飞”,或者你想精确分析一个实时…
📅 2026/7/19 8:17:55
1. 项目概述与调试架构解析在嵌入式开发,尤其是基于ARM架构的复杂SoC(如TI的AM62L Sitara™处理器)开发中,高效的调试与追踪能力是决定项目成败的关键因素之一。想象一下,你面对的是一个集成了多个Cortex-A/M核、DSP以…
📅 2026/7/19 8:17:55
1. SpringBoot与ActiveMQ整合概述 在微服务架构中,消息队列是实现服务解耦的利器。最近在项目中用SpringBoot整合ActiveMQ时,发现官方文档虽然全面但缺乏实战细节。这里记录下我的配置过程和踩坑经验,特别是自动配置机制和性能调优部分。 Ac…
📅 2026/7/19 8:17:55
1. 项目概述与核心价值最近在折腾一个挺有意思的项目,核心目标是把语音识别这个事儿从单一的云端处理,拆解到边缘和云端协同完成。简单来说,就是让靠近用户的设备(比如智能音箱、工控机、车载中控)先对语音进行初步处理…
📅 2026/7/19 8:17:55
Windows任务栏透明美化终极指南:3种安装方式5大效果模式全解析 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB
想让你的Windo…
📅 2026/7/19 8:16:55
1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…
📅 2026/7/19 0:00:51
1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…
📅 2026/7/19 0:00:51
更多请点击:
https://intelliparadigm.com
第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…
📅 2026/7/19 0:00:51
1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…
📅 2026/7/19 0:00:51
1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…
📅 2026/7/19 0:00:51
更多请点击:
https://intelliparadigm.com
第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…
📅 2026/7/19 0:00:51
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/19 7:02:11
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/18 17:01:33
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/19 5:02:03