08- Redis 中的 GEO 数据类型和应用场景

1. 介绍

Redis GEO 是 Redis 3.2 版本新增的数据类型,主要用于存储地理位置信息,并对存储的信息进行操作。

在日常生活中,我们越来越依赖搜索“附近的餐馆”、在打车软件上叫车,这些都离不开基于位置信息服务(Location-Based Service,LBS)的应用。LBS 应用访问的数据是和人或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,GEO 就非常适合应用在 LBS 服务的场景中。

2. 内部实现

GEO 本身并没有设计新的底层数据结构,而是直接使用了 Sorted Set 集合类型。

GEO 类型使用 GeoHash 编码方法实现了经纬度到 Sorted Set 中元素权重分数的转换,这其中的两个关键机制就是【对二维地图做区间划分】和【对区间进行编码】。一组经纬度落在某个区间后,就用区间的编码值来表示,并把编码值作为 Sorted Set 元素的权重分数。

这样一来,我们就可以把经纬度保存到 Sorted Set 中,利用 Sorted Set 提供的“按权重进行有序范围查找”的特性,实现 LBS 服务中频繁使用的“搜索附近”的需求。

3. 常用命令

# 存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
GEOADD key longitude latitude member [longitude latitude member ...]
​
# 从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nul。
GEOPOS key member [member ...]
​
# 返回两个给定位置之间的距离
GEODIST key member1 member2 [m|km|ft|mi]
​
# 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

4. 应用场景1

4.1 滴滴叫车

这里以滴滴叫车的场景为例,介绍下具体如何使用 GEO 命令:GEOADD 和 GEORADIUS 这两个命令。

假设车辆 ID 是 33,经纬度位置是(116.034579,39.030452),我们可以用一个 GEO 集合保存所有车辆的经纬度,集合 key 是 cars:locations。

执行下面的这个命令,就可以把 ID 号 为 33 的车辆的当前经纬度位置存入 GEO 集合中。

GEOADD cars:locations 116.034579 39.030452 33

当用户想要寻找自己附近的网约车时,LBS 应用就可以使用 GEORADIUS 命令。

例如,LBS 应用执行下面的命令时,Redis 会根据输入的用户的经纬度信息116.054579,39.030452 ),查找以这个经纬度为中心的 5 公里内的车辆信息,并返回给 LBS 应用。

GEORADIUS cars:locations 116.054579 39.030452 5 km ASC COUNT 10

相关推荐

  1. 08- Redis GEO 数据类型应用场景

    2024-06-06 17:56:03       7 阅读
  2. Redis数据类型详解与应用场景

    2024-06-06 17:56:03       27 阅读
  3. Redis 数据类型及使用场景

    2024-06-06 17:56:03       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 17:56:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 17:56:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 17:56:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 17:56:03       18 阅读

热门阅读

  1. 语义化版本控制:软件工程的实用之道

    2024-06-06 17:56:03       9 阅读
  2. C语言---指针part2

    2024-06-06 17:56:03       8 阅读
  3. jvm 触发GC的时机和条件

    2024-06-06 17:56:03       6 阅读
  4. 分析JVM堆Dump日志定位线程阻塞原因

    2024-06-06 17:56:03       10 阅读
  5. 进口单座调节阀的特点

    2024-06-06 17:56:03       10 阅读
  6. 二叉树的右视图-力扣

    2024-06-06 17:56:03       7 阅读
  7. python脚本将视频抽帧为图像数据集

    2024-06-06 17:56:03       9 阅读
  8. Golang获取文件名扩展名/后缀

    2024-06-06 17:56:03       8 阅读