【redis】数据类型之geo
Redis的GEO
数据类型用于存储地理位置信息(如经纬度),并提供高效的地理位置查询功能(如计算两地距离、搜索附近地点等)。其底层基于Sorted Set
(有序集合)实现,通过Geohash
编码将经纬度转换为分数(score
)进行存储。
有关hyperloglog类型的命令可以通过help @geo
命令来查看。有关命令的使用可以通过help 命令
来查看,例如help geoadd
。
命令的使用
GEOADD
GEOADD:将一个或多个地理坐标(经度、纬度、名称)添加到指定 key
。
语法:
GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]
选项说明:
- key:用于存储地理位置信息的键名。
- longitude:地理位置的经度,经度范围:
-180
到180
- latitude:地理位置的纬度,纬度范围:
-85.05112878
到85.05112878
。 - member:与经纬度关联的成员名称,通常是一个字符串标识符,比如一个地点名。
- NX:仅添加新成员(不更新已存在的成员)。
- XX:仅更新已存在的成员(不添加新成员)。
- CH:返回被修改的成员数量(默认返回新增数量)。
使用:
127.0.0.1:6379> geoadd cities 116.28 39.54 beijing 121.29 31.14 shanghai 117.11 39.09 tianjin
(integer) 3127.0.0.1:6379> type cities
zset
GEOPOS
GEOPOS:查询一个或多个成员的经纬度。
语法:
GEOPOS key member [member ...]
使用:
127.0.0.1:6379> geopos cities beijing tianjin
1) 1) "116.28000229597091675"2) "39.54000124957348561"
2) 1) "117.11000114679336548"2) "39.08999952855024418"
GEODIST
GEODIST:计算两个成员间的距离,支持单位:m
(米,默认)、km
(千米)、mi
(英里)、ft
(英尺)。
语法:
GEODIST key member1 member2 [M|KM|FT|MI]
使用:
127.0.0.1:6379> geodist cities beijing tianjin km
"87.2150"
GEOHASH
GEOHASH:返回成员的Geohash字符串(将二维经纬度编码为一维字符串,便于比较位置相似性)。
语法:
GEOHASH key member [member ...]
使用:
127.0.0.1:6379> geohash cities beijing tianjin
1) "wx48yn090q0"
2) "wwgq2uhgub0"
GEORADIUS
GEORADIUS:根据给定的中心点坐标和半径,查找附近的成员。
语法:
GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key|STOREDIST key]
选项说明:
- key:存储地理位置信息的Redis键名。
- longitude和latitude:查询的中心点的经度和纬度。
- radius:搜索半径,可以是米(m)、千米(km)、英尺(ft)或英里(mi)。
- [WITHCOORD]:返回匹配元素的经纬度。
- [WITHDIST]:返回匹配元素到中心点的距离。
- [WITHHASH]:返回匹配元素的Geohash值。
- [COUNT count]:限制返回结果的数量。
- [ASC|DESC]:按距离升序或降序排序。
- [STORE key]:将返回的结果存储到指定的Redis键中。
- [STOREDIST key]:将返回的结果及其到中心点的距离存储到指定的Redis键中。
使用:
127.0.0.1:6379> georadius cities 119.30 35.35 2000 km count 2
1) "tianjin"
2) "shanghai"
GEORADIUSBYMEMBER
GEORADIUSBYMEMBER:根据给定的成员和半径,查找附近的成员。
语法:
GEORADIUSBYMEMBER key member radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key|STOREDIST key]
使用:
127.0.0.1:6379> georadiusbymember cities beijing 1000 km withdist
1) 1) "beijing"2) "0.0000"
2) 1) "tianjin"2) "87.2150"
GEORADIUS_RO
GEORADIUS_RO:GEORADIUS_RO命令是GEORADIUS命令的只读版本。从Redis版本6.2.0开始,GEORADIUS命令被视为已废弃,建议在新代码中使用GEOSEARCH和GEOSEARCHSTORE命令替代GEORADIUS的相关功能。
语法:
GEORADIUS_RO key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC]
使用:
127.0.0.1:6379> georadius_ro cities 119.30 35.35 1000 km count 2 withdist
1) 1) "tianjin"2) "458.9460"
2) 1) "shanghai"2) "503.4887"
GEORADIUSBYMEMBER_RO
GEORADIUSBYMEMBER_RO:GEORADIUSBYMEMBER_RO命令是GEORADIUSBYMEMBER命令的只读版本。
语法:
GEORADIUSBYMEMBER_RO key member radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC]
使用:
127.0.0.1:6379> georadiusbymember_ro cities beijing 1000 km withdist
1) 1) "beijing"2) "0.0000"
2) 1) "tianjin"2) "87.2150"
GEOSEARCH
GEOSEARCH:根据指定的查询参数在Redis的地理空间数据集中搜索符合条件的位置。
语法:
GEOSEARCH key FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius M|KM|FT|MI|BYBOX width height M|KM|FT|MI [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]
选项说明:
- key:存储地理位置信息的Redis键名。
- [FROMMEMBER member]:使用有序集中给定的现有位置作为查询的中心点。
- [FROMCOORD longitude latitude]:使用给定的经度和纬度作为查询的中心点。
- [BYRADIUS radius unit]:根据给定的半径在一个圆形区域中进行搜索。
- [BYBOX width height unit]:根据给定的高度和宽度在一个矩形区域中进行搜索。
- [WITHCOORD]:返回匹配位置的经度和纬度。
- [WITHDIST]:返回匹配位置与指定中心点的距离。
- [ASC|DESC]:按距离升序或降序排序返回结果。
- [COUNT count]:限制返回结果的数量。
- [STORE key]:将搜索结果存储到指定的新键中。
- [STOREDIST key]:将搜索结果及其与查询点的距离存储到指定的新键中。
使用:
127.0.0.1:6379> geosearch cities fromlonlat 119.30 35.35 byradius 1000 km count 2
1) "tianjin"
2) "shanghai"127.0.0.1:6379> geosearch cities frommember beijing byradius 2000 km count 2
1) "beijing"
2) "tianjin"
GEOSEARCHSTORE
GEOSEARCHSTORE:与GEOSEARCH命令类似,但它不直接返回搜索结果给客户端,而是将搜索结果存储到一个新的键中。这对于需要在服务器端保存搜索结果以便后续处理或分析的场景非常有用。
语法:
GEOSEARCHSTORE destination source FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius M|KM|FT|MI|BYBOX width height M|KM|FT|MI [ASC|DESC] [COUNT count [ANY]] [STOREDIST]
使用:
127.0.0.1:6379> geosearchstore searchResult cities frommember beijing byradius 2000 km count 2
(integer) 2127.0.0.1:6379> zrange searchResult 0 -1 withscores
1) "beijing"
2) "4069140601296155"
3) "tianjin"
4) "4069185489583420"
应用场景
附近的人/地点:根据用户位置搜索周边的餐厅、商店等。
距离计算:物流应用中计算配送距离。
地理围栏:监控设备或用户是否进入特定区域。
底层实现与性能
Geohash编码:将经纬度转换为一个double
类型的分数(score
),存储在Sorted Set
中。
查询原理:利用Sorted Set
的范围查询特性,快速筛选出Geohash相近的位置。
注意事项
数据精度:Geohash精度受半径影响,小范围搜索更准确。
性能优化:大量数据时建议分片(按区域拆分多个key
)。
命令版本:Redis 6.2+推荐使用GEOSEARCH
替代GEORADIUS
和GEORADIUSBYMEMBER
。
无法分页:例如附近的人列表无法根据距离从近到远实现分页查询,此时需要使用mongo或者es来实现。
在Java中的使用
package com.morris.redis.demo.geo;import org.redisson.Redisson;
import org.redisson.api.GeoUnit;
import org.redisson.api.RGeo;
import org.redisson.api.RedissonClient;
import org.redisson.api.geo.GeoSearchArgs;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;import java.util.List;/*** redisson中geo的使用*/
public class RedissonGeoDemo {public static void main(String[] args) {// 配置Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 创建Redisson客户端实例RedissonClient redisson = Redisson.create(config);RGeo<Object> geo = redisson.getGeo("geo:cities", StringCodec.INSTANCE);geo.add(116.28, 39.54, "beijing");geo.add(121.29, 31.14, "shanghai");geo.add(117.11, 39.09, "tianjin");Double dist = geo.dist("beijing", "shanghai", GeoUnit.KILOMETERS);System.out.println(dist); // 1038.543List<Object> search = geo.search(GeoSearchArgs.from(119.30, 35.35).radius(1000, GeoUnit.KILOMETERS));System.out.println(search); // [beijing, tianjin, shanghai]redisson.shutdown();}
}
相关文章:

【redis】数据类型之geo
Redis的GEO数据类型用于存储地理位置信息(如经纬度),并提供高效的地理位置查询功能(如计算两地距离、搜索附近地点等)。其底层基于Sorted Set(有序集合)实现,通过Geohash编码将经纬度…...

vue3 vite或者vue2 百度地图(卫星图)离线使用详细讲解
1、在Windows上下载瓦片,使用的工具为: 全能电子地图下载器3.0最新版(推荐) 下载后解压,然后进入目录"全能电子地图下载器3.0最新版(推荐)\全能电子地图下载器3.0\MapTileDownloader" 在这个目录…...

《Python实战进阶》No17: 数据库连接与 ORM(SQLAlchemy 实战)
No17: 数据库连接与 ORM(SQLAlchemy 实战) 摘要 本文深入探讨SQLAlchemy在复杂场景下的高级应用,涵盖四大核心主题: 会话生命周期管理:通过事件钩子实现事务监控与审计追踪混合继承映射:结合单表/连接表继…...

工程化与框架系列(27)--前端音视频处理
前端音视频处理 🎥 引言 前端音视频处理是现代Web应用中的重要组成部分,涉及音频播放、视频处理、流媒体传输等多个方面。本文将深入探讨前端音视频处理的关键技术和最佳实践,帮助开发者构建高质量的多媒体应用。 音视频技术概述 前端音视…...

芋道打包时报错:缺失@unocss插件
在遇到打包时,报这个错误,提示构建失败是因为 ESLint 在加载 unocss 插件时,找不到 unocss/eslint-plugin 模块 解决办法:安装缺失的依赖:保证unocss/eslint-plugin已经被正确安装, 使用以下命令安装&…...

PY32MD320单片机 QFN32封装,内置多功能三相 NN 型预驱。
PY32MD320单片机是普冉半导体的一款电机专用MCU,芯片采用了高性能的 32 位 ARM Cortex-M0 内核,主要用于电机控制。PY32MD320嵌入高达 64 KB Flash 和 8 KB SRAM 存储器,最高工作频率 48 MHz。PY32MD320单片机的工作温度范围为 -40 ~ 105 ℃&…...

深入解析 configService.addListener 使用中的注意事项
在使用 Nacos 的 configService.addListener 方法进行配置监听时,为了确保程序的稳定性、可靠性以及高效性,有诸多注意事项需要我们关注。下面将对这些关键要点进行详细阐述。 一、连接稳定性 1.1 网络连接问题 Nacos 客户端与服务端通过网络进行通信&…...

Windows控制台函数:控制台读取输入函数ReadConsoleA()
目录 什么是 ReadConsoleA? 它长什么样? 怎么用它? 它跟 std::cin 有什么不一样? 注意事项 什么是 ReadConsoleA? ReadConsoleA 是一个 Windows API 函数,用来从控制台读取用户输入。想象一下&#…...

奇安信 2025 年护网蓝队初选笔试题(附答案解析)
🔥 爆款 CSDN 题库 | 超全护网蓝队笔试真题 | 含详细答案解析 🔥 熬夜为大家整理了 奇安信 2025 年护网蓝队初选笔试题,(关注我我会持续更新)涵盖 SQL 注入、Web 安全、渗透测试、二进制安全 等核心知识点,…...

国产编辑器EverEdit - Web预览设置
1 设置-高级-Web预览 1.1 设置说明 选择主菜单工具 -> 设置 -> 常规,在弹出的选项窗口中选择Web预览分类,如下图所示: 1.1.1 本地浏览HTML文件 如果用户只是在本地浏览HTML文件,即直接用浏览器打开HTML文件,确…...

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 or Set--lower_bound()的解法!!!
P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 题目 并查集解析代码【并查集解】 Set 解法解析lower_bound代码 题目 并查集解析 首先先让所有的f(i)i,即每个人最开始的祖先都是自己,然后就每一次都让轮到那个数的父亲1(…...

HTML 编辑器推荐与 VS Code 使用教程
在进行 HTML 编程时,选择一款合适的 HTML 编辑器能极大地提高开发效率。以下为大家推荐几款常用且功能强大的 HTML 编辑器,同时详细介绍如何使用 VS Code 创建和预览 HTML 文件。 一、HTML 编辑器推荐 VS Code:由微软开发,是一款…...

MyBatis增删改查:静态与动态SQL语句拼接及SQL注入问题解析
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。本文将深入探讨 MyBatis 中的增删改查操作,重点讲解静态与动态 SQL 语句的拼接,并分析 S…...

在运维工作中,Lvs、nginx、haproxy工作原理分别是什么?
在运维工作中,LVS、NGINX和HAProxy都是常用的负载均衡和反向代理工具,它们在高可用性和负载均衡场景中发挥重要作用。以下是其原理和应用场景详解: LVS(Linux Virtual Server) 工作原理 LVS是基于Linux内核的负载均…...

linux学习(五)(服务器审查,正常运行时间负载,身份验证日志,正在运行的服务,评估可用内存)
服务器审查 在 Linux 中审查服务器的过程包括评估服务器的性能、安全性和配置,以确定需要改进的领域或任何潜在问题。审查的范围可以包括检查安全增强功能、检查日志文件、审查用户帐户、分析服务器的网络配置以及检查其软件版本。 Linux 以其稳定性和安全性而闻名…...

Java在小米SU7 Ultra汽车中的技术赋能
目录 一、智能驾驶“大脑”与实时数据 场景一:海量数据的分布式计算 场景二:实时决策的毫秒级响应 场景三:弹性扩展与容错机制 技术隐喻: 二、车载信息系统(IVI)的交互 场景一:Android Automo…...

开发环境搭建-02.后端环境搭建-熟悉项目结构
一.后端环境搭建...

js实现pdf文件路径预览和下载
预览 直接浏览器窗口打开默认就是预览 window.open(文件路径)下载 function downloadPDF(url, filename) {fetch(url).then(response > response.blob()).then(blob > {const link document.createElement(a);link.href URL.createObjectURL(blob);link.download fi…...

【RAG】基于向量检索的 RAG (BGE示例)
RAG机器人 结构体 文本向量化: 使用 BGE 模型将文档和查询编码为向量。 (BGE 是专为检索任务优化的开源 Embedding 模型,除了本文API调用,也可以通过Hugging Face 本地部署BGE 开源模型) 向量检索: 从数据库中找到与查询相关的文…...

Vue源码解析之mustache模板引擎
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...

python: DDD using postgeSQL and SQL Server
postgreSQL 注意: # psycopg 2 驱动的连接字符串 #engine create_engine(postgresql://post:geovindulocalhost:5433/TechnologyGame) #Session sessionmaker(bindengine)# 使用 psycopg3 驱动的连接字符串 #engine create_engine(postgresqlpsycopg://user:g…...

Python实例:PyMuPDF实现PDF翻译,英文翻译为中文,并按段落创建中文PDF
基于PyMuPDF与百度翻译的PDF翻译处理系统开发:中文乱码解决方案与自动化排版实践 一 、功能预览:将英文翻译为中文后创建的PDF 二、完整代码 from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle...

IntelliJ IDEA 2021版创建springboot项目的五种方式
第一种方式,通过https://start.spring.io作为spring Initializr的url来创建项目。 第二种方式,通过https://start.spring.io官网来直接创建springboot项目压缩包,然后导入至我们的idea中。 点击generate后,即可生成压缩包…...

c#面试题整理6
1.String类能否被继承,为什么 可以看到String类的修饰符是sealed,即是密封类,故不可被继承 2.一个对象的方法是否只能由一个线程访问 不是,但是可通过同步机制,确保同一个时间只有一个线程访问 3.计算2*8ÿ…...

跟着 Lua 5.1 官方参考文档学习 Lua (12)
文章目录 5.7 – Input and Output Facilities补充内容io.input ([file])io.read ()io.write ()io.output ([file])io.lines ([filename])io.flush ()io.close ([file])io.open (filename [, mode])io.popen (prog [, mode])io.tmpfile ()io.type (ob)file:read ()file:lines (…...

大语言模型中的归一化技术:LayerNorm与RMSNorm的深入研究
在LLama等大规模Transformer架构的语言模型中,归一化模块是构建网络稳定性的关键组件。本文将系统分析归一化技术的必要性,并详细阐述为何原始Transformer架构中的LayerNorm在LLama模型中被RMSNorm所替代的技术原理。 归一化技术的基础原理 归一化的核…...

nodejs使用WebSocket实现聊天效果
在nodejs中使用WebSocket实现聊天效果(简易实现) 安装 npm i ws 实现 创建 server.js /*** 创建一个 WebSocket 服务器,监听指定端口,并处理客户端连接和消息。** param {Object} WebSocket - 引入的 WebSocket 模块,…...

【仿muduo库one thread one loop式并发服务器实现】
文章目录 一、项目介绍1-1、项目总体简介1-2、项目开发环境1-3、项目核心技术1-4、项目开发流程1-5、项目如何使用 二、框架设计2-1、功能模块划分2-1-1、SERVER模块2-1-2、协议模块 2-2、项目蓝图2-2-1、整体图2-2-2、模块关系图2-2-2-1、Connection 模块关系图2-2-2-2、Accep…...

10.2 继承与多态
文章目录 继承多态 继承 继承的作用是代码复用。派生类自动获得基类的除私有成员外的一切。基类描述一般特性,派生类提供更丰富的属性和行为。在构造派生类时,其基类构造函数先被调用,然后是派生类构造函数。在析构时顺序刚好相反。 // 基类…...

Go红队开发—格式导出
文章目录 输出功能CSV输出CSV 转 结构体结构体 转 CSV端口扫描结果使用CSV格式导出 HTML输出Sqlite输出nmap扫描 JSONmap转json结构体转jsonjson写入文件json编解码json转结构体json转mapjson转string练习:nmap扫描结果导出json格式 输出功能 在我们使用安全工具的…...