Redis Geo操作地理位置
Redis Geo
- 使用场景
- API列表名词
- API列表
- Springboot使用
- maven
- yaml
- Test
- 注意事项
Redis Geo 是Redis在3.2版本中新增的功能,用于存储和操作地理位置信息
使用场景
- 滴滴打车:这是一个对地理位置精度要求较高的场景。通过使用Redis的GEO功能,滴滴打车可以存储房源和店铺的地理位置信息,并根据用户所在位置的经纬度,加上范围,查询到附近的房源和店铺列表,放到高德地图中展现出来。
- 直播业务:比如主播开播的时候写入主播Id的经纬度,关播的时候删除主播Id元素,这样就维护了一个具有位置信息的在线主播集合提供给线上检索。
- 自如、蛋壳、链家、美团等平台也有根据距离找房源或者商铺的功能,这个功能也是使用的Redis的GEO功能。
API列表名词
| 字段 | 含义 |
|---|---|
| longitude | 经度 |
| latitude | 纬度 |
| member | 位置名称 |
| radius | 距离中心位置的距离 |
| m/km/ft/mi | 距离中心位置的单位,米/千米/英里/英尺 |
| WITHCOORD | 返回距离中心位置元素及经纬度 |
| WITHDIST | 返回距离中心位置元素及距离 |
| WITHHASH | 返回距离中心位置元素及geohash 值 |
| COUNT | 返回距离中心位置元素的元素个数 |
| ASC/DESC | 距离远近排序 |
| STORE key | 返回的集合元素存储到某个key中 |
| STOREDIST key | 返回的元素距离集合存储到某个key中 |
| BYRADIUS | 按圆形扫描 |
| BYBOX | 按矩形扫描 |
API列表
| 名称 | 含义 | 指令 |
|---|---|---|
| GEOADD | 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中 | GEOADD key longitude latitude member [longitude latitude member …] |
| GEOPOS | 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度) | GEOPOS key member [member …] |
| GEOHASH | 用于获取一个或多个位置元素的 geohash 值 | GEOHASH key member [member …] |
| GEODIST | 用于返回两个给定位置之间的距离 | GEODIST key member1 member2 [m/km/ft/mi] |
| GEORADIUS | 以给定的经纬度为中心, 返回键包含的位置元素中, 与中心的距离不超过给定最大距离(radius)的所有位置元素 | GEORADIUS key longitude latitude radius [m/km/ft/mi] [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC |
| GEORADIUSBYMEMBER | 与GEORADIUS 相似,只是该指令是以位置(member)为中心 | GEORADIUSBYMEMBER key member radius [m/km/ft/mi] [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC/DESC] [STORE key] [STOREDIST key] |
| GEOSEARCH | 存在高版本Redis中,GEORADIUS升级,除了可以设置扫描范围,还可以设置扫描形状(圆形,矩形),geosearch的功能更加强大和灵活,可以满足更多的使用场景和需求 | GEOSEARCH key <member / longitude latitude> <[BYRADIUS radius [m/km/ft/mi] ]/ [BYBOX width height [m/km/ft/mi]]> [ASC/DESC] [COUNT count] [WITHCOORD] [WITHDIST][WITHHASH] |
Springboot使用
maven
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency>
yaml
spring:redis:host: 127.0.0.1 # Redis 服务器地址port: 6379 # Redis 服务器端口database: 0 # Redis 数据库索引(默认为0)
Test
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.GeoResults;
import org.springframework.data.geo.Point;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.domain.geo.Metrics;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest
public class MyDemoApplicationTests {@AutowiredStringRedisTemplate redisTemplate;/*** 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。*/@Testpublic void redisTestAdd() {Long a = redisTemplate.opsForGeo().add("geo", new Point(13.261391222476959, 38.215556214674542), "a");//params: key, Point(经度, 纬度), 地方名称Long b = redisTemplate.opsForGeo().add("geo", new Point(15.087267458438873, 37.50266842333162), "b");//params: key, Point(经度, 纬度), 地方名称System.out.println(a);System.out.println(b);}/*** 从key里返回所有给定位置元素的位置(经度和纬度)。*/@Testpublic void redisTestGeoGet() {List<Point> points = redisTemplate.opsForGeo().position("geo", "a", "b");//params: key, 地方名称...System.out.println(points);}/*** 返回两个给定位置之间的距离。*/@Testpublic void testDist() {Distance distance = redisTemplate.opsForGeo().distance("geo", "a", "b", RedisGeoCommands.DistanceUnit.KILOMETERS);//params: key, 地方名称1, 地方名称2, 距离单位System.out.println(distance);}/*** 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素,并给出所有位置元素与中心的平均距离。*/@Testpublic void redisTestNearByXY() {Circle circle = new Circle(new Point(114.05, 22.55), new Distance(200, Metrics.KILOMETERS));//Point(经度, 纬度) Distance(距离量, 距离单位)RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(5);GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo().radius("geo", circle, args);//params: key, Circle, GeoRadiusCommandArgsSystem.out.println(results);}/*** 以给定的城市为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素,并给出所有位置元素与中心的平均距离。*/@Testpublic void testNearByPlace() {Distance distance = new Distance(200, Metrics.KILOMETERS);//params: 距离量, 距离单位RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(5);GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo().radius("geo", "a", distance, args);//params: key, 地方名称, Circle, GeoRadiusCommandArgsSystem.out.println(results);}/*** 返回一个或多个位置元素的 Geohash 表示*/@Testpublic void testGeoHash() {List<String> results = redisTemplate.opsForGeo().hash("geo", "a", "b");//params: key, 地方名称...System.out.println(results);}}
注意事项
- 在Redis的集群环境中,不建议将大量的数据存储在一个zset集合中,因为这会导致集群迁移时出现卡顿现象,影响线上服务的正常运行。如果数据量过大,需要对数据进行拆分,按国家、省份、城市等拆分。
- 建议将频繁访问的数据存储在Redis中,而将低频数据存储在其他数据库中。
- 避免将不相关的数据业务都放到一个Redis中,这可以避免业务相互影响,避免单实例膨胀,并能在故障时降低影响面,快速恢复。
- 由于Redis是单线程服务,消息过大会阻塞并拖慢其他操作。因此,需要保持消息内容在1KB以下,严禁超过50KB的单条记录。
相关文章:
Redis Geo操作地理位置
Redis Geo 使用场景API列表名词API列表Springboot使用mavenyamlTest 注意事项 Redis Geo 是Redis在3.2版本中新增的功能,用于存储和操作地理位置信息 使用场景 滴滴打车:这是一个对地理位置精度要求较高的场景。通过使用Redis的GEO功能,滴滴…...
市面上的AR眼镜:优缺点分析
AR眼镜是近年来备受关注的科技产品之一。它通过将虚拟信息叠加到现实世界中,为用户提供全新的视觉体验。目前,市面上的AR眼镜主要分为两类:消费级AR眼镜和企业级AR眼镜。 消费级AR眼镜 消费级AR眼镜的特点是轻便、时尚、易于佩戴࿰…...
2024年湖南省职业院校技能竞赛高职组电子与信息专业类软件测试赛项竞赛规程及样题
湖南省职业院校技能竞赛 高职组电子与信息专业类软件测试赛项竞赛规程及样题 一、竞赛内容 1.本赛项考查的技术技能和涵盖的职业典型工作任务 任务项 任务名称 职业典型工作任务 任务一 功能测试 测试计划、测试报告文档设计与编写、测试用例 设计、测试执行和 Bug记录 任务二…...
10、pytest通过assert进行断言
官方实例 # content of test_assert1.pydef f():return 3def test_function():assert f() 4def test_assert_desc():a f()# assert a % 2 0assert a % 2 0, "value was odd, should be even"解读与实操 pytest允许你使用标准python断言来验证测试中的期望值&am…...
Webpack技术入门与实践
1.概念: 本质上, webpack是一个现代JavaScript应用程序的静态模块打包器,当webpack处理应用程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bund…...
HarmonyOS开发(九):数据管理
1、概述 1.1、功能简介 数据管理为开发者提供数据存储、数据管理能力。 它分为两个部分: 数据存储:提供通用数据持久化能力,根据数据特点,分为用户首选项、键值型数据库和关系型数据库。数据管理:提供高效的数据管…...
acwing-Linux学习笔记
acwing-Linux课上的笔记 acwing-Linux网址 文章目录 1.1常用文件管理命令homework作业测评命令 2.1 简单的介绍tmux与vimvimhomeworktmux教程vim教程homework中的一些操作 3 shell语法概论注释变量默认变量数组expr命令read命令echo命令printf命令test命令与判断符号[]逻辑运算…...
Python渗透测试——一、数据包的编辑工具——Scapy
Python渗透测试 一、Scapy简介二、Scapy中的分层结构三、Scapy中的常用函数四、在Scapy 中发送和接收数据包五、Scapy 中的抓包函数 一、Scapy简介 提到数据包(这里泛指帧、段和报文等)的构造,我们首先需要了解协议和分层这两个概念。在“互联世界的规则一协议”中…...
使用webstrom编写vue开启提示
1.语言服务器选择 2.文件类型–忽略的文件和文件夹,删去,node_modules,就可以点进去库了 3.禁用JSLint、TSLint 4.开启node辅助 5.如果是vite,开启自动读取,或手动指定 6.如果是Webpack,开启自动读取&#…...
linux远程桌面管理工具(xrdp)、向日葵
Windows远程桌面 linux远程桌面 使用向日葵远程桌面(手机端同理) Windows远程桌面 微软自带Remote Desktop Connection Manager (RDCMan)远程控制管理软件介绍 远程桌面连接管理器 v2.93 linux远程桌面 Windows远程桌面Ubunt…...
【力扣100】8.找到字符串中所有字母异位词
添加链接描述 class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:sildingstrresult[]p.join(sorted(p))for i in range(len(s)):if len(sildingstr)<len(p):sildingstrsildingstrs[i]# print(sildingstr)if len(sildingstr)len(p):sort_sildingstr.j…...
圆通速递查询,圆通速递单号查询,用表格导出查询好的物流信息
批量查询圆通速递单号的物流信息,以表格的形式导出查询好的物流信息。 所需工具: 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界…...
FLStudio中文2024中文最新汉化安装包下载
FLStudio中文21最新版本以其使用速度而闻名,是一个高度复杂的音乐制作环境。FL Studio免费,联合国音序器音频和MIDI每个复合编辑都是音乐。现代的DAW是一种非凡的野兽。首先,它在很大程度上把自己放在了(几乎)每个人记录过程的核心。其次&…...
AI:大语言模型训练方法 - 机器学习
Transformer Transformer是一种深度学习的模型架构,特别适用于自然语言处理任务。Transformer 模型的核心创新在于其 "自注意力"(Self-Attention)机制,这种机制使得模型可以有效地捕捉输入数据中的长距离依赖关系。 T…...
Linux(17):认识与分析登录档
什么是登录档 【详细而确实的分析以及备份系统的登录文件】是一个系统管理员应该要进行的任务之一。 登录档 就是记录系统活动信息的几个文件,例如:何时、何地(来源IP)、何人(什么服务名称)、做了什么动作(讯息登录啰)。 换句话说就是:记录系…...
STM32上模拟CH340芯片的功能 (一)
#虚拟串口模拟CH340# 代码gitee地址:STM32F103_CH340: 用STM32模拟ch340USB串口的功能 一、思路 1. 确定通信接口:CH340是一款USB转串口芯片,因此您需要选择STM32上的某个USB接口来实现USB通信。通常情况下,STM32系列芯片都有内…...
图论——最小生成树
图论——最小生成树 A wise man changes his mind, a fool never will 生成树 一个连通图的生成树是一个极小的连通子图,它包含图中全部的n个顶点,但只有构成一棵树的n-1条边。 最小生成树 在这些边中选择N-1条出来,连接所有的N个点。这N-1…...
C++基础 -42- STL库之list链表
———————STL库之list链表——————— 🎄 list链表的格式(需要定义头文件) list<int> data1(4, 100);list<int> data2(4, 500);🎄list链表的合并接口 🎄举例使用合并接口并且验证 data2.merge(data1);list<int>::…...
Backend - Python 序列化
目录 一、作用1:代码块存入数据库 二、作用2:前后端传递数据 (一)前端 1. JSON.stringify() 2. JSON.parse() (二)后端 1. json.dumps() (1)作用 (2)…...
初级数据结构(一)——顺序表
文中代码源文件已上传:数据结构源码 <-上一篇 NULL | 初级数据结构(二)——链表 下一篇-> 1、顺序表的特点 1.1、数组 现实中数据记录一般都记录在表格中,如进货单、菜单等,它们的最大特点就是…...
Taotoken用量看板功能详解,助你洞察团队AI资源消耗模式
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken用量看板功能详解,助你洞察团队AI资源消耗模式 对于技术管理者或项目负责人而言,清晰了解团队的AI…...
ArduPilot飞行模式实战:从代码角度看Stabilize、Acro、Loiter模式如何切换(附避坑指南)
ArduPilot飞行模式深度解析:从状态机到实战避坑指南 在开源飞控领域,ArduPilot以其强大的飞行模式系统著称。不同于普通用户只需了解模式功能,开发者更需要掌握模式切换的底层机制——这直接关系到飞行安全与二次开发效率。本文将带您深入Sta…...
为内部知识库问答机器人集成taotoken多模型能力的架构设计
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为内部知识库问答机器人集成taotoken多模型能力的架构设计 应用场景类,探讨为企业内部知识库构建智能问答机器人时&…...
D3KeyHelper终极指南:5分钟掌握暗黑3最强自动化工具
D3KeyHelper终极指南:5分钟掌握暗黑3最强自动化工具 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为《暗黑破坏神3…...
多智能体协作系统:2026年企业级AI应用的核心架构范式
引言:AI Agent从单兵作战到团队协作的范式跃迁 2026年,人工智能领域正在经历一场深刻的架构变革。回想2024年,当ChatGPT、Claude等大语言模型横空出世时,我们惊叹于单个AI模型的强大能力。然而,随着企业级应用的深入,单一AI Agent的局限性日益凸显:它无法同时处理多领域…...
构建内容生成服务时利用Taotoken实现模型降级容灾
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 构建内容生成服务时利用Taotoken实现模型降级容灾 在构建面向用户的在线内容生成服务时,服务的稳定性和可用性是核心考…...
Keil C166汇编头文件路径问题解决方案
1. 问题现象与背景解析作为一名长期使用Keil C166开发工具的嵌入式工程师,我最近在移植一个老项目时遇到了一个典型的路径查找问题。项目混合了C和汇编代码,当我把自定义的DEFS.INC汇编头文件放在项目INC目录下,并在Target Environment中正确…...
哔哩漫游X:全面解锁B站功能的终极ReVanced增强模块
哔哩漫游X:全面解锁B站功能的终极ReVanced增强模块 【免费下载链接】BiliRoamingX-integrations BiliRoamingX integrations and patches powered by ReVanced. 项目地址: https://gitcode.com/gh_mirrors/bi/BiliRoamingX-integrations B站作为中国最大的视…...
机器学习赋能微服务架构拆分:从图划分到智能决策的工程实践
1. 从单体巨石到微服务:为什么我们需要机器学习的“火眼金睛”在软件架构演进的漫长征途中,我们正经历一场深刻的范式转移。曾几何时,单体架构(Monolithic Architecture)因其开发简单、部署直接而大行其道,…...
手机号码定位技术:从查询到地图可视化的完整解决方案
手机号码定位技术:从查询到地图可视化的完整解决方案 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirro…...
