如何提升Redis地理位置搜索性能_利用GeoHash算法与缓存结合

阿雪大大_9260

阿雪大大_9260

2026-07-10

344人浏览

原创

redis原生geo命令不依赖geohash前缀索引,而是将经纬度编码为52位整数存入zset的score字段,通过zrangebyscore实现o(log n)区间查找;范围查询后仍需haversine计算过滤,高并发大数据量时cpu易成为瓶颈。

如何提升redis地理位置搜索性能_利用geohash算法与缓存结合

Redis原生GEO命令查得快,但不是靠Geohash前缀索引

很多人误以为 GEOSEARCHGEORADIUS 是靠 Geohash 字符串前缀加速的,实际完全不是。Redis 内部把经纬度编码成一个 52 位整数(GeoHashBits),存进 ZSet 的 score 字段,所有范围查询本质是 ZRANGEBYSCORE —— 靠跳表的 O(log N) 整数区间查找,不涉及任何字符串前缀匹配或字典序扫描。

这意味着:你手动存 geo:ws10e 这样的 key,再用 ZRANGEBYLEX 查前缀,和 Redis 原生 GEO 完全是两套逻辑,不能混用;也别指望给 GEORADIUS 加个索引 hint 就能提速。

  • Geohash 字符串本身只用于展示或调试(GEOHASH 命令返回),不参与查询路径
  • GEORADIUS 底层仍需对范围内所有候选点重新算 Haversine 距离,过滤超距点
  • 所以当 ZSet 成员超 10 万、QPS 超 500 时,CPU 会卡在浮点计算上,而不是 I/O 或内存带宽

什么时候该自己做 Geohash 分桶 + 多 key 查询

只有满足以下全部条件,才值得放弃原生 GEO,改用分桶策略:

  • 查询半径固定(如“附近 3km 充电桩”),且业务能容忍 ±0.6km 误差(对应 6 位 Geohash)
  • ZSet 单 key 成员长期 > 50 万,GEORADIUS 平均耗时 > 15ms,监控显示 cpu_sys 持续 > 70%
  • 写入频次低(GEOADD QPS 1k),且允许应用层二次过滤

典型做法是:用 geohash2.encode(lat, lon, precision=6) 算出目标点的 9 个邻近格网(中心 + 8 方向),并发查 geo:bucket:ws10egeo:bucket:ws10f 等最多 9 个 key,最后在应用层合并并剔除真实距离超限的点。

注意:精度选 6~7 位最稳。8 位(±19m)会导致单点落入 25+ 个邻近格网,key 数爆炸;5 位(±4.9km)则单桶平均含 2000+ 点,过滤开销反而更大。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载

缓存层加在哪?不是结果缓存,而是 Geohash 格网映射缓存

直接缓存 GEORADIUS 结果(比如用 SETEX nearby:116.4,39.9:3km "user1,user2...")效果很差:坐标小数点后第 5 位一变,key 就失效;用户拖地图连续请求,缓存命中率趋近于 0。

真正有效的缓存点是「坐标 → 邻近格网列表」的映射,例如:

GET geohash:gridmap:116.40523,39.90418:6
→ ["ws10e", "ws10f", "ws11e", ...]

这个映射稳定、计算开销固定(一次 encode + 9 邻域生成),可设 TTL 1h,命中后直接发起 9 个 SMEMBERSZRANGEBYSCORE 请求,绕过原生 GEO 的距离重算环节。

  • SET + EX 存,不要用 Hash;key 中必须包含精度(如 :6),不同精度映射不能复用
  • 客户端首次请求未命中时,调用 geohash2.bboxes() 生成邻域,再 SET 回 Redis,避免多个请求并发重建
  • 不缓存原始坐标到 member 的映射(如 116.40523,39.90418 → user123),那等于在 Redis 里建二级索引,违背分桶初衷

容易被忽略的三个硬约束

哪怕你把分桶逻辑写得再漂亮,踩中下面任一坑,性能都会断崖下跌:

  • GEOADD 前没做坐标归一化:round(lat, 6) 在 Python 里可能因 float 表示误差导致同一位置生成不同 Geohash;必须用 f"{lat:.6f}" 格式化后再传入
  • member 设计不合理:若直接用 "user_123" 当 member,设备反复上报就会覆盖旧坐标;应组合唯一标识与归一化坐标,如 "user_123:116.405230:39.904180"
  • 没处理极点与国际日期变更线:赤道附近经度从 179.9° 跳到 -179.9° 时,Geohash 编码完全断裂;geohash2 等库默认不处理,需在调用前加 wrap-around 校验(如经度差 > 180° 则 ±360° 归一)

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

4676

4

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4029

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3535

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6272

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

603

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

716

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

5702

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1120

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

936

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习