Redis6.2发布 地理位置功能增强了什么?

2020-12-21  本文已影响0人  阿里云数据库

Redis社区最近刚刚发布Redis6.2 RC1版本,在本次发布中,阿里云Tair团队(阿里云内存数据库产研团队,负责云上Redis社区版和Redis企业版Tair)为社区贡献了大量高质量代码与功能,其中关于地理位置查询能力的提升上,阿里云贡献了GEOSEARCH和GEOSEARCHSTORE两个重要而强大的API。本文通过分析这两个全新的API,对Redis在地理位置型应用进行深入剖析,并延伸介绍了阿里云Tair在地理位置上的更多强大功能与应用场景。

1.Redis 6.2 GEOSEARCH命令详解

Redis自3.2版本,增加了地理位置的相关API:

然而随着互联网生活的本地化进程加快,诸如同城购,社区团购与买菜、电子单车围栏等基于地理位置的业务的飞速发展,过去开源Redis只能搜索圆形区域的能力并不能满足用户的搜索需求,在最新版Redis 6.2中,阿里云Tair团队将阿里云Redis企业版Tair性能增强型中包含的相关矩形搜索能力贡献给了社区。

图1. 阿里云Tair对Redis 6.2地理位置能力的贡献

新增的GEOSEARCH和GEOSEARCHSTORE命令拥有更丰富的语法,满足了搜索矩形的应用需求。

图2. 矩形搜索 vs 圆形搜索
GEOSEARCH key 
[FROMMEMBER member] [FROMLONLAT long lat] 
[BYRADIUS radius unit] [BYBOX width height unit] 
[WITHCOORD] [WITHDIST] [WITHHASH] 
[COUNT count] [ASC|DESC]

该API返回使用GEOADD填充的地理空间信息有序集合中位于给定形状所划定的区域边界内的所有成员。

其中搜索中心有两种指定方式:

搜索条件按照下面两种:

后面更多的可选参数如下:

GEOSEARCHSTORE与GEOSEARCH相似,只是将搜索结果存储在指定的key中。

举例如下,对于一个正方形(橙色区域)以及其内接圆(蓝色区域)的搜索,可以看到,位于正方形,但是没有在内接圆中的点edge1和edge2可以通过BYBOX指定矩形搜索的方式被搜索出来:

图3. 地理位置搜索示意图
127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
127.0.0.1:6379> GEOADD Sicily 12.758489 38.788135 "edge1" 17.241510 38.788135 "edge2"
(integer) 2
127.0.0.1:6379> GEOSEARCH Sicily FROMLONLAT 15 37 BYRADIUS 200 km ASC
1) "Catania"
2) "Palermo"
127.0.0.1:6379> GEOSEARCH Sicily FROMLONLAT 15 37 BYBOX 400 400 km ASC
1) "Catania"
2) "Palermo"
3) "edge2"
4) "edge1"

注:左右滑动阅览

2.Redis GEO的不足

从实现原理上讲,Redis本身的GEO功能底层是根据GeoHash算法,将地理位置坐标转换为52bit的整形数字之后,存储在Sorted Set中。因为GeoHash的特性,地理位置距离越近则数值大小越相似,然后通过ZRANGEBYSCORE key min max WITHSCORES查询Sorted Set范围内的点并判断距离是否在搜索范围内。

目前在最新版6.2 RC1中虽然支持了圆形与矩形的搜索,但是Redis GEO仍旧有很多场景限制,例如:

要解决这些问题,需要从GIS原理重新审视。Redis目前使用的GeoHash原理本质上是对二维坐标进行了降维,将其表示为一个long数字或者base32编码,但是这种索引只适合查询点和点的关系,对于更复杂的线与面的关系,需要更复杂的索引结构RTree1来解决。RTree可以将多个不规则多边形求Minimum bounding box(最小限定矩形)之后存储在一棵RTree中用来检索。

图4. RTree原理

正是由于复杂的运算和存储索引,传统关系型如PostGIS和落盘型(On-Disk Database)数据库在地理位置高并发更新和查询时效率不高。而将数据结构化在内存数据库中(In-Memory Database),结合Tair增强性能的高吞吐引擎可以使得存储查询效率得到能力的量级提升。

3.阿里云TairGIS介绍

TariGIS是阿里云Redis企业版性能增强型其中的一个Module,使用RTree做索引,支持GIS(Geographic Information System,地理信息系统)各种丰富的API查询2。TairGIS不仅兼容Redis GEO,并且支持线、面的查询,功能更加强大,能够更广泛地用于各类基于地理位置的应用及业务中。

主要的功能如下:

如下展示TairGIS兼容上面Redis GEO例子并增加线和面的搜索:

// 使用TairGIS可以添加 POINT(点)/LINESTRING(线)/POLYGON(面) 三种图形
127.0.0.1:7379> GIS.ADD Sicily Palermo 'POINT (13.361389 38.115556)' Catania 'POINT (15.087269 37.502669)'  // 添加点
(integer) 2
127.0.0.1:7379> GIS.ADD Sicily edge1 'POINT (12.758489 38.788135)' edge2 'POINT (17.241510 38.788135)'
(integer) 2
127.0.0.1:7379> GIS.SEARCH Sicily RADIUS 15 37 200 km // 使用半径查询
1) (integer) 2
2) 1) "Palermo"
   2) "POINT(13.361389 38.115556)"
   3) "Catania"
   4) "POINT(15.087269 37.502669)"
127.0.0.1:7379> GIS.ADD Sicily polygon 'POLYGON ((13.361389 38.115556, 15.087269 37.502669, 17.241510 38.788135))' // 添加 Palermo,Catania,edge2的三角形
(integer) 1
127.0.0.1:7379> GIS.SEARCH Sicily GEOM "POLYGON ((12.7484 35.2018, 12.7484 38.7981, 17.2515 38.7981, 17.2515 35.2018))"  // 等同于 BYBOX 400 400 km,TairGIS可以指定任意形状的多边形查询,而非受限于矩形
1) (integer) 5
2) 1) "Palermo"
   2) "POINT(13.361389 38.115556)"
   3) "Catania"
   4) "POINT(15.087269 37.502669)"
   5) "edge1"
   6) "POINT(12.758489 38.788135)"
   7) "edge2"
   8) "POINT(17.24151 38.788135)"
   9) "polygon"
   10) "POLYGON((13.361389 38.115556,15.087269 37.502669,17.24151 38.788135))"
127.0.0.1:7379> GIS.SEARCH Sicily GEOM "POLYGON ((12.7484 35.2018, 12.7484 38.7981, 17.2515 38.7981))"  // 使用三角形查询,可以看到edge2被排除,因为polygon和三角形有重合,所以被查询出来
1) (integer) 4
2) 1) "Palermo"
   2) "POINT(13.361389 38.115556)"
   3) "Catania"
   4) "POINT(15.087269 37.502669)"
   5) "edge1"
   6) "POINT(12.758489 38.788135)"
   7) "polygon"
   8) "POLYGON((13.361389 38.115556,15.087269 37.502669,17.24151 38.788135))"
127.0.0.1:7379>

注:左右滑动阅览

TairGIS的API如下所示:

通过使用TairGIS可以构建各种丰富的基于地理位置的应用,举例如下:

本地生活

在淘宝的门店服务中,使用TairGIS做商家服务范围(一个面)与消费者(一个点)之间的关系判断,从而确定消费者是否在商家的服务范围中。

图5. 构建本地生活应用 图5. 构建本地生活应用

电子围栏

判断共享单车是否在禁停区内,是否已经归还到还车区(通过点和面的包含关系来判断),电子围栏用途非常广泛,还包括安全应用如儿童电子围栏,也包括无人机起飞禁飞区判定等。

图6. 构建共享单车还车区域应用

疫情防控

在疫情期间,判断用户的轨迹(一条线)是否经过疫区(一个面),即判断线与面的相交关系即可确认用户是否经过疫区。具体方案可参考:使用TairGIS实现用户轨迹监测

https://help.aliyun.com/document_detail/163537.html

图片

图7. 构建用户轨迹判定应用

目前包含上述TairGIS强大地理位置能力的阿里云Redis企业版性能增强型限时限量特惠,新购和续费年付5折,月付7折,Redis全兼容,更强大性能,更大带宽,更大连接数,更丰富实用的数据结构,具备全球分布式多活、数据闪回等多个企业级能力。

参考文献:

1.RTree工作原理介绍:

Guttman, A. (1984). "R-Trees: A Dynamic Index Structure for Spatial Searching"

2.TairGIS命令文档:

https://help.aliyun.com/document_detail/145971.html

上一篇 下一篇

猜你喜欢

热点阅读