Redis学习笔记-GEO经纬度编码原理&地理划分

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis学习笔记-GEO经纬度编码原理&地理划分

在日常生活中,我们经常使用手机搜索附近的餐馆,或者在打车软件上打车,都需要获取用户和服务商之间位置信息,而 Redis 提供了一种可以查询地理位置信息的数据结构 GEO,其底层实现原理和 有序集合(Sorted Set) 的原理一样,我们知道有序集合数据特点就是每个值有对应的权重(score),这篇文章学习一下 GEO 如何对经纬度编码,然后通过这种编码实现 有序集合(Sorted Set)中就有了权重(score)了,这样就能快速找到相邻经纬度信息的数据了。


1.笔记图

2.GEO 应用场景


  • 搜索附近的餐馆
  • 在打车软件上叫车

3.GEO 数据特点举例

  • 网约车都有编号(如 33),网约车要将自己的经纬度信息(如 116.034579 39.000452)发给叫车应用
  • 用户叫车的时候,叫车应用会根据用户的位置(如 116.054579,39.030452)查找附近车辆
  • key(例如车 ID)对应一个 value(一组经纬度)

4.GeoHash 的编码方法(二分区间,区间编码)

  • 对经度值的范围做多次分区,当做完 N 次二分区后,经度值就可以用 N bit 的数来表示了
  • 第一次二分区经度范围 [-180,180] 会被分成两个子区间:[-180,0)[0,180](左、右分区),要查询的经度落在左分区就用 0 表示,否则用 1 表示,如经度 115 第一次二分区编码 1
  • 第二次分区:如经度 115 第一次落在 [0,180] 区间,第二次二分区就把 [0,180] 分成 [0,90)[90,180]115 落在 [90,180] ,第二次分区的编码 1
  • 第三次二分区:如经度 115 第二次落在 [90,180] 区间,第三次二分区就把 [90,180] 分成 [90,135)[135,180]115 落在 [90,135),第三次分区的编码 0
  • 第四次二分区:如经度 115 第三次落在 [90,135) 区间,第四次二分区就把 [90,135) 分成 [90,112.5) [112.5,135]115 落在 [112.5,135],第四次分区的编码 1
  • 第五次二分区:如经度 115 第四次落在 [112.5,135] 区间,第五次二分区就把 [112.5,135] 分成 [112.5,123.75) [123.75,135]115 落在 [112.5,123.75),第五次分区的编码 0
  • 五次编码综合11010

Tips:维度的编码和经度类似,维度范围是 [-90,90]

5.GEO 经纬度编码组合

  • 组合规则:最终编码值的偶数位上依次是经度的编码值,奇数位上依次是纬度的编码值,偶数从第 0 位开始,奇数从第 1 位开始
  • 作用:原来无法用一个权重分数表示的一组经纬度(116.37,39.86)就可以用 1110011101 这一个值来表示,就可以保存为 Sorted Set 的权重分数了,这样在查找附近的数据时就很方便了。

6.地理位置划分举例

使用 GeoHash 编码后,相当于把整个地球地理空间划分成了一个个方格,每个方格对应了 GeoHash 中的一个分区,举例:

  • 把经度区间 [-180,180] 做一次二分区,把纬度区间 [-90,90] 做一次二分区,就会得到 4 个分区

  • 分区一[-180,0)[-90,0),编码 00
  • 分区一[-180,0) [-90,0),编码 00
  • 分区二[-180,0)[0,90],编码 01
  • 分区三[0,180][-90,0),编码 10
  • 分区四[0,180][0,90],编码 11
  • 作用:使用 Sorted Set 范围查询得到的相近编码值,在实际的地理空间上,也是相邻的方格,这就可以实现 搜索附近的人或物 的功能了
  • 特殊情况处理
  • 有的编码值虽然在大小上接近,但实际对应的方格却距离比较远

  • 为了避免查询不准确问题,我们可以同时查询给定经纬度所在的方格周围的 4 个或 8 个方格

7.GEO 相关命令


  • GEOADD 命令
  • 用于把一组经纬度信息和相对应的一个 ID 记录到 GEO 类型集合中
  • 假设车辆 ID 33,经纬度位置是(116.034579,39.030452),我们可以用一个 GEO 集合保存所有车辆的经纬度,集合 key cars:locations
GEOADD cars:locations 116.034579 39.030452 33
  • GEORADIUS 命令
  • 用户想要寻找自己附近的网约车时,LBS 应用就可以使用 GEORADIUS 命令
  • 查找以这个经纬度为中心的 5 公里内的车辆信息,并返回给 LBS 应用
GEORADIUS cars:locations 116.054579 39.030452 5 km ASC COUNT 10
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6天前
|
缓存 NoSQL Apache
【Redis】布隆过滤器原理与应用
【Redis】布隆过滤器原理与应用
20 1
|
2天前
|
存储 缓存 NoSQL
由菜鸟到大神,谈谈redis的概念、实战、原理、高级使用方法
【5月更文挑战第18天】Redis是一个开源的内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串、哈希、列表、集合、有序集合等。
20 10
|
6天前
|
NoSQL API Redis
Redis源码、面试指南(3)数据对象类型编码(下)
Redis源码、面试指南(3)数据对象类型编码
11 1
|
6天前
|
存储 NoSQL API
Redis源码、面试指南(3)数据对象类型编码(上)
Redis源码、面试指南(3)数据对象类型编码
17 2
|
6天前
|
存储 NoSQL 算法
Redis源码、面试指南(2)内存编码数据结构(下)
Redis源码、面试指南(2)内存编码数据结构
20 4
|
6天前
|
存储 NoSQL API
Redis源码、面试指南(2)内存编码数据结构(上)
Redis源码、面试指南(2)内存编码数据结构
17 0
|
6天前
|
负载均衡 NoSQL 关系型数据库
深入浅出Redis(六):Redis的主从架构与主从复制原理
深入浅出Redis(六):Redis的主从架构与主从复制原理
|
6天前
|
SQL NoSQL Java
Redis数据类型 Hash Set Zset Bitmap HyperLogLog GEO
Redis数据类型 Hash Set Zset Bitmap HyperLogLog GEO
18 0
|
6天前
|
监控 NoSQL 算法
深入剖析Redis哨兵模式的原理和应用
Redis的哨兵模式是实现高可用性和自动故障转移的机制,当主服务器故障时,哨兵能自动检测并进行故障转移,确保服务连续和稳定性。哨兵模式通过监控主从服务器状态、自动故障转移、防止数据不一致,提高容错能力和负载均衡,降低运维成本,实现高可用性。哨兵通过检测主观下线和客观下线状态,以及选举Leader Sentinel来协调故障转移。Raft算法在其中用于领导者选举和状态一致性。哨兵模式通过综合考虑多种因素选举新主服务器并执行故障转移,保障集群稳定运行。
88 0
深入剖析Redis哨兵模式的原理和应用
|
6天前
|
NoSQL Redis
Redis入门到通关之Redis主从数据同步原理
Redis入门到通关之Redis主从数据同步原理
31 0