redis GEO 类型原理及命令详解

目录

前言

一、GeoHash 的编码方法

二、Redis 操作GEO类型


前言

我们有一个需求是用户搜索附近的店铺,就是所谓的位置信息服务(Location-Based Service,LBS)的应用。这样的相关服务我们每天都在接触,用滴滴打车,中午去美团订外卖等等。当我们用这些服务方便我们的生活的时候,大家有没有想过是怎么实现的。目前市场上很多软件比如Es,Redis 都提供了类似的功能,他们底层都是用的GeoHash 编码,只不过底层的数据结构不同。今天主要讲的是Redis 的 Geo 如何实现这个功能

一、GeoHash 的编码方法

Redis 常用的数据类型有String(字符串)、List(列表)、Hash(哈希)、Set(集合)和 Sorted Set(有序集合)。位置信息存储一定是key,value,value 就是经纬度。用List、Hash,Set 去存储,没有办法去排序,当然也是不可以的。最接近的数据结构是Sorted Set,可以根据score 排序同时也满足范围获取。又有一个问题是 score 是 float 类型的,经纬度不是的,好像也不可以,能不能用一种编码把经纬度变成float 类型的,这种编码就是GeoHash。

为了能高效地对经纬度进行比较,Redis 采用了业界广泛使用的 GeoHash 编码方法,这个方法的基本原理就是“二分区间,区间编码”。当我们用GeoHash编码时,我们要先对经度和维度分别编码,然后再把经纬度各自的编码组合成一个最终编码。

我们看看经纬度的编码过程。

对于一个定理信息来说,它的经度范围是[-180,180],纬度范围是[-90,90]。GeoHash编码会把经,纬度做N次二分区操作,其中N是自定义的。

先拿经度来说,范围是[-180,180]会被分成两个子区间:【-180,0)和【0,180】(我称为左右分区)。此时我们要看下经度是落在左右哪个分区上,落在左分区用0表示,又分区用1 表示。第二次在把落在的分区又分成左右两个分布,在看下经度是落在哪个分区上,落在左分区用0表示,又分区用1 表示。依次类推,只要分成了N份结束了。最终得到的是N bit 的位数,例如10111 这样的数据。

纬度也是同样的,只不过,纬度的范围是【-90,90】。每次也是平均分成左右两个分区,落在左分区用0表示,又分区用1 表示。最终得到的也是N bit 的位数,例如10110 这样的数据。

最终得倒的是2个N bit 的位数,最终进行组合。组合规则是第 0 位是经度的第 0 位 1,第 1 位是纬度的第 0 位 1,第 2 位是经度的第 1 位 1,第 3 位是纬度的第 1 位 0。

下面我们会举一个例子,来阐述算法具体的实现:经度值 116.37,纬度值 39.86, N是5。

经度分区过程 116.37:

分区次数左分区右分区经度116.37所在的分区编码
1【-180,0)[0,180][0,180]1
2[0,90)[90,180][90,180]1
3[90,135)[135,180][90,135)0
4[90,112.5)[112.5,135][112.5,135]1
5[112.5,123.75)[123.75,135][112.5,123.75)0

最终编码是11010

纬度的编码过程是 39.86

分区次数左分区右分区纬度 39.86所在的分区编码
1【-90,0)【0,90]【0,90]1
2[0,45)[45,90][45,90]0
3[0,22.5)[22.5,45][22.5,45]1
4[22.5,33.75)[33.75,45][33.75,45]1
5[33.75,39.375)[39.375.45][39.375,45]1

最终编码是 10111

GeoHash最终编码是,回顾编码规则:组合规则是第 0 位是经度的第 0 位 1,第 1 位是纬度的第 0 位 1,第 2 位是经度的第 1 位 1,第 3 位是纬度的第 1 位 0

经度编码11010
奇偶数(位数)0123456789
纬度编码10111

经度编码和纬度编码合并:一共是10位数, 1110011101,位数不要错了,这个最终就是 Sorted Set 的 sort 值了。

当然,使用 GeoHash 编码后,我们相当于把整个地理空间划分成了一个个方格,每个方格对应了 GeoHash 中的一个分区。举个例子。我们把经度区间[-180,180]做一次二分区,把纬度区间[-90,90]做一次二分区,就会得到 4 个分区。我们来看下它们的经度和纬度范围以及对应的 GeoHash 组合编码。分区一:[-180,0) 和[-90,0),编码 00;分区二:[-180,0) 和[0,90],编码 01;分区三:[0,180]和[-90,0),编码 10;分区四:[0,180]和[0,90],编码 11。

这 4 个分区对应了 4 个方格,每个方格覆盖了一定范围内的经纬度值,分区越多,每个方格能覆盖到的地理空间就越小,也就越精准。我们把所有方格的编码值映射到一维空间时,相邻方格的 GeoHash 编码值基本也是接近的,如下图所示:

所以,我们使用 Sorted Set 范围查询得到的相近编码值,在实际的地理空间上,也是相邻的方格,这就可以实现 LBS 应用“搜索附近的人或物”的功能了。不过,我要提醒你一句,有的编码值虽然在大小上接近,但实际对应的方格却距离比较远。例如,我们用 4 位来做 GeoHash 编码,把经度区间[-180,180]和纬度区间[-90,90]各分成了 4 个分区,一共 16 个分区,对应了 16 个方格。编码值为 0111 和 1000 的两个方格就离得比较远,如下图所示:

二、Redis 操作GEO类型

在使用 GEO 类型时,我们经常会用到两个命令,分别是 GEOADD 和 GEORADIUS。

GEOADD 命令:用于把一组经纬度信息和相对应的一个 ID 记录到 GEO 类型集合中;

GEORADIUS 命令:会根据输入的经纬度位置,查找以这个经纬度为中心的一定范围内的其他元素。当然,我们可以自己定义这个范围。

操作如下:

GEOADD 如果member 没有就增加,有就是修改,用 GEOPOS cars:locations 33 可以看到每个member 具体的经纬度

GEORADIUS 可以根据坐标找到相应的member。命令的详解可以看官网文档 GEORADIUS | Redis

非常感谢 蒋德钧的《Redis 核心技术与实战》以及 redis 官网提供了非常宝贵的资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2803667.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

文章SCI/EI检索流程

前言: 想查询某篇文章是否被SCI/EI检索,以及其对应SCI/EI检索号可通过以下流程查询。 一、SCI检索 网址:https://webofscience-clarivate-cn-s.xidian.yitlink.com/wos/alldb/basic-search 搜索对应论文的题目,若有对应查询结果…

无法收到邮箱验证码

我们在注册,找回密码的时候,如果没有收到验证码,可以尝试以下几种方式解决: 使用QQ邮箱注册 现在常用的邮箱应该是QQ邮箱,所以后台也是使用QQ邮箱给大家发送验证码,所以大家的接受邮箱也最后是qq邮箱 在垃圾箱中查找…

Nginx 配置前端工程项目二级目录

前提: 前端工程技术框架: vue 后端工程技术工程:spring boot 需求:需要通过二级目录访问前端工程: 如之前:http://127.0.0.1:80/ 改成 http://127.0.0.1/secondDirectory:80/ 一.前端工程支持二级目录 1.编译文…

C 标准库 - <errno.h>

在C语言编程中&#xff0c;<errno.h> 头文件扮演着至关重要的角色&#xff0c;它提供了一个全局变量 errno 以及一系列预定义宏&#xff0c;用于指示系统调用或库函数执行过程中发生的错误。这些宏有助于程序员诊断和处理运行时错误。 errno 变量 extern int errno;err…

flannel网络拓扑

测试环境创建 在k8s中部署flannel网络插件 https://blog.csdn.net/weixin_64124795/article/details/128894411 参考文章部署k8s集群和flannel网络插件 我的k8s集群物理环境 我的集群中只有两个节点master和node1节点 [rootmaster sjs]# kubectl get node NAME STATU…

音视频技术-声反馈啸叫的产生与消除

目录 1.均衡调节: 2.移频法: 3.移相法: 4.比较法: 在扩音系统中,产生啸叫危害很大,一方面影响会议、演出等活动的正常进行,另一方面严重的啸叫会导致音响设备的损坏。 “啸叫”是“声反馈”的俗称,形成的机制复杂,消除的手段多样,专业调音师也对

Windows软件卸载基本思路

&#x1f4ab;作者&#xff1a;南城余 &#x1f31f;全平台账号&#xff1a;公众号、CSDN、GitHub、语雀、知乎 前提提要&#xff1a; 相信大家都被Windows软件卸载恶心过吧&#xff1f; 那Windows软件到底应该怎么卸载呢&#xff1f; 跟着下面方法&#xff0c;你一定可以成…

谷歌最新黑科技:Gemini 1.5携100万Token挑战AI多模态极限

最近科技圈再次迎来震撼弹&#xff01;除了火爆全球的openAI Sora文生视频模型外&#xff0c;谷歌发布了其大模型矩阵的最新成员——Gemini 1.5&#xff0c;一举将上下文窗口长度扩展至惊人的100万个tokens。这不仅仅是一个简单的数字增加&#xff0c;而是一次划时代的飞跃&…

SpringCloud-Gateway解决跨域问题

Spring Cloud Gateway是一个基于Spring Framework的微服务网关&#xff0c;用于构建可扩展的分布式系统。在处理跨域问题时&#xff0c;可以通过配置网关来实现跨域资源共享&#xff08;CORS&#xff09;。要解决跨域问题&#xff0c;首先需要在网关的配置文件中添加相关的跨域…

linux逻辑卷/dev/mapper/centos-root扩容增加空间

centos7中/dev/mapper/centos-root扩容 问题文件系统根目录&#xff0c;/dev/mapper/centos-root空间满了&#xff0c;导致k8s不停重启 1.查看磁盘情况 df -h #查看最大占用目录 du -h -x --max-depth12.查看磁盘信息 fdisk -l3.查看磁盘分区层级 lsblk可见剩余空闲60G空间…

二十三、视频处理和保存

项目功能实现&#xff1a;获取视频的参数信息&#xff0c;对视频文件进行转换到HSV色域空间并保存到指定路径中去 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 video_save.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class Vid…

Redis(十六)缓存预热+缓存雪崩+缓存击穿+缓存穿透

文章目录 面试题缓存预热缓存雪崩解决方案 缓存穿透解决方案 缓存击穿解决方案案例&#xff1a;高并发聚划算业务 总结表格 面试题 缓存预热、雪崩、穿透、击穿分别是什么?你遇到过那几个情况?缓存预热你是怎么做的?如何避免或者减少缓存雪崩?穿透和击穿有什么区别?他两是…

websocket了解下

websocket请求长啥样 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13 啥是websocket websocket是http的一种&#xff0c;服务器可以主动向客户端推送信息&#xff0c;…

电阻篇 | 二、压敏电阻

电阻篇 | 二、压敏电阻 定义 压敏电阻是一种具有非线性伏安特性得电阻器件&#xff0c;无极性&#xff0c;主要用在电路承受过压时进行电压钳位&#xff0c;吸收多余得电流以保护敏感器件&#xff0c;英文名称 Voltage Dependent Resistor&#xff0c;简称VDR&#xff0c;或者…

适合上班族使用的便签备忘录推荐哪个?

在如今较为繁忙的职场中&#xff0c;上班族家人们经常需要处理各种琐碎的工作任务。为了更好地管理时间、提高工作效率&#xff0c;一款好用的便签备忘录成为了不少上班族的首选工具。市面上各式各样的便签备忘录都有&#xff0c;但好用便签以其简洁方便的操作方式和多样化功能…

Excel快速下拉填充数据至9999行,再筛选出想要的数据

1 测试计算公式 2 选中单元格 3 批量赋值 4 数据筛选&#xff1a; 数据 -> 自动筛选 &#xff0c;列头出现三角箭头&#xff0c;进行过滤就可以了

证件照(兼容H5,APP,小程序)

证件照由uniappuyui开发完成&#xff0c;并同时兼容H5、App、微信小程序、支付宝小程序&#xff0c;其他端暂未测试。 先看部分效果图吧具体可以下方复制链接体验demo 首页代码 <template><view class""><view class"uy-m-x-30 uy-m-b-20"…

记一次 Flink 作业启动缓慢

记一次 Flink 作业启动缓慢 背景 应用发现&#xff0c;Hadoop集群的hdfs较之前更加缓慢&#xff0c;且离线ELT任务也以前晚半个多小时才能跑完。此前一直没有找到突破口所以没有管他&#xff0c;推测应该重启一下Hadoop集群就可以了。今天突然要重启一个Flink作业&#xff0c…

大模型分布式训练方法FDSP和DeepSpeed

备注&#xff1a; 本文部分内容参考自其他作者的内容&#xff0c;如有不妥&#xff0c;请联系&#xff0c;立即删除。 pytorch单精度、半精度、混合精度、单卡、多卡&#xff08;DP / DDP&#xff09;、FSDP、DeepSpeed模型训练 相关代码&#xff1a;pytorch-model-train-temp…

python递归算法

递归算法 一、嵌套调用的过程二、递归的基本原则1、递归的基本原则2、无限递归调用3、正常递归调用4、阶乘问题5、力扣&#xff1a;231. 2 的幂6、力扣面试题 08.05. 递归乘法7、力扣、326. 3 的幂8、力扣342. 4的幂 一、嵌套调用的过程 def show1():print("show 1 run s…