详解redis(13):数据结构GEO

Redis GEO = 用 ZSet + GeoHash,把二维经纬度问题,降维成一维 score 的范围查询问题

核心只有三点:

二维 → 一维(降维)

GeoHash 编码
ZSet 的 score 范围查询

一、为什么 GEO 不直接存经纬度?

经纬度是 二维坐标 (lat, lon) ,而 Redis 最擅长的是一维有序数据(ZSet)。

Redis 的思路是:

把二维空间映射成一条"近似保持空间关系的一维曲线"

二、GeoHash 是怎么工作的?

第一步:对二维地图做"区间划分"

先看全球范围:

维度 范围
经度 -180 ~ 180
纬度 -85.05112878 ~ 85.05112878

GeoHash 的做法是:

不断 二分经度区间

再 二分纬度区间

经度、纬度交替进行

第二步:区间编码(GeoHash 编码)

二进制还不方便存,于是:

每 5 位二进制 → 1 个 Base32

Redis 内部 不是存字符串形式的 GeoHash,而是:

把 GeoHash 转成一个 64 位整数

为什么 GeoHash 能"找附近"?

关键特性:

地理位置相近的点,GeoHash 编码也大概率相近

GEORADIUS / GEOSEARCH 是怎么查附近的?

以「查 5km 内的点」为例:

根据中心点算 GeoHash

得到中心点的 GeoHash 区间。

找"周围 8 个格子"

GeoHash 会有边界问题

所以 Redis 会算:

当前格子

上下左右 + 四个角(共 9 个)

转成 score 范围查询

精确距离过滤(很重要)

GeoHash 是 近似 的

所以 Redis 最后一步会算真实球面距离:

所以结果是 精确的

三、场景建模:滴滴叫车到底在查什么?

当你在滴滴上点「叫车」时,系统核心要做三件事:

实时上报车辆位置

从当前位置附近找车
按距离排序,选最近的几辆

这三件事,Redis GEO 刚好全部覆盖

相关推荐
青春不朽5121 小时前
Python 里 a is b 有时 True 有时 False?小整数缓存和常量折叠的底层真相
python·spring·缓存
AllData公司负责人1 小时前
AllData搭建AI中台,集成开源项目LabelStudio/CubeStudio,建设数据标注平台/机器学习平台
数据库·人工智能·机器学习·labelstudio·cubestudio
2601_962071001 小时前
Kimi K3 vs DeepSeek V4-Pro实测对比:2026年同一入口十道题,耗时与token消耗差在哪
android·java·数据库
mengzhi啊2 小时前
把数据存入sql数据库。qt,c++。
数据库·sql·qt
ManageEngineITSM2 小时前
工单优先级怎么定?影响×紧急度矩阵的设计与落地方法
java·大数据·运维·前端·数据库·变更管理
科研online2 小时前
数据资源:中国10年旅游流动网络数据集
数据库
智商网输送线配件2 小时前
电子制造零散耗材补货实战:小批量混批采购平台怎么选才不停机?
大数据·服务器·前端·数据库·自动化
Lysander.Jovian2 小时前
Redis使用
redis
救救孩子把2 小时前
AI面试八股文-03_3-RAG 系统面试题
人工智能·redis·面试·agent·rag
小冯不疯2 小时前
集成中心架构:PULL × PUSH × 集成转换的三大引擎
数据库·架构