tablestore列式存储原理_TableStore最佳实践:轻松实现轨迹管理与地理围栏

一、方案背景

轨迹管理系统日常生活中使用非常普遍,如外卖派送轨迹、快递物流流转、车辆定位轨迹等。该场景与地理位置管理类似,核心点与瓶颈都在数据库的存储性能与查询能力,同时需要时间字段正序排列,保证轨迹点顺序;一方面,存储服务需要应对海量数据的低延迟存、读,另一方面,存储服务也要提供高效的多维度数据检索与排序。表格存储(TableStore)对于轨迹管理场景,依然可以胜任,完全具备实现轨迹管理系统的能力。

不妨来体验一下基于TableStore打造的【亿量级摩托车管理系统】样例;

需求场景

某城市市区出于安全考虑,限制摩托车进入一定的区域范围。某摩托车租赁公司,为了更好管理所辖摩托车的违章问题,对自己所辖摩托车安装定位系统,定时采集摩托车位置。摩托车租赁公司,可以通过轨迹管理平台,查询统计违章情况,也可作为依据,提醒违章的租赁用户,过多违章拉入黑名单;

查询场景:【2018年11月01日】编号【id00001】的摩托车行驶轨迹与违章情况查询;

样例如下:

注:该样例提供了【亿量级】轨迹数据。官网控制台地址:项目样例

样例内嵌在表格存储控制台中,用户可登录控制台体验系统(若为表格存储的新用户,需要点击开通服务后体验,开通免费,订单数据存储在公共实例中,体验不消耗用户存储、流量、Cu)。

表格存储(TableStore)方案

采用表格存储(TableStore)轻松搭建一套:亿量级摩托车管理系统。多元索引功能提供GEO检索、多维查询的能力,通过对时间的排序获取追踪设备的轨迹。同时,用户可随时创建索引然后完成自动同步,不用担心存量数据问题。

TableStore作为阿里云提供的一款全托管、零运维的分布式NoSql型数据存储服务,具有【海量数据存储】、【热点数据自动分片】、【海量数据多维检索】等功能,有效的地解决了GEO数据量大膨胀这一挑战;

SearchIndex功能在保证用户数据高可用的基础上,提供了数据多维度搜索、排序等能力。针对多种场景创建多种索引,实现多种模式的检索。用户可以仅在需要的时候创建、开通索引。由TableStore来保证数据同步的一致性,这极大的降低了用户的方案设计、服务运维、代码开发等工作量。

二、搭建准备

若您对于基于TableStore实现的【亿量级摩托车管理系统】体验不错,并希望开始自己系统的搭建之旅,只需按照如下步骤便可以着手搭建了:

1、开通表格存储

通过控制台开通表格存储服务,表格存储即开即用(后付费),采用按量付费方式,已为用户提供足够功能测试的免费额度。表格存储官网控制台、免费额度说明。

2、创建实例

通过控制台创建表格存储实例,选择支持多元索引的Region。(当前阶段SearchIndex功能尚未商业化,暂时开放北京,上海,杭州和深圳四地,其余地区将逐渐开放)

创建实例后,提交工单申请多元索引功能邀测(商业化后默认打开,不使用不收费)。

邀测地址:提工单,选择【表格存储】>【产品功能、特性咨询】>【创建工单】,申请内容如下:

问题描述:请填写【申请SearchIndex邀测】

机密信息:请填写【地域+实例名】,例:上海+myInstanceName

3、SDK下载

使用具有多元索引(SearchIndex)的SDK,官网地址,暂时java、go、node.js三种SDK增加了新功能

java-SDK

com.aliyun.openservices

tablestore

4.7.4

go-SDK

$ go get github.com/aliyun/aliyun-tablestore-go-sdk

4、表设计

店铺检索系统样例,仅简易使用一张店铺表,主要包含字段:店铺类型、店铺名称、店铺地理位置、店铺平均评分、人均消费消等。表设计如下:

表名:geo_track

列名数据类型索引类型字段说明

_id(主键列)

String

MD5(mId + timestamp)避免热点

mId

Stirng

摩托车编号

timestamp

long

LONG

时间点(毫秒时间戳)

pos

String

GEO_POINT

车辆位置:"30.132,120.082"(纬度,精度)

...

...

...

...

三、开始搭建(核心代码)

1、创建数据表

用户仅需在完成邀测的实例下创建“摩托车轨迹表”:通过控制台创建、管理数据表(用户也可以通过SDK直接创建):其他表如租赁用户表、摩托车信息表等,根据需求创建:这里仅展示轨迹表,表名:geo_track

2、创建数据表索引

TableStore自动做全量、增量的索引数据同步:用户可以通过控制台创建索引、管理索引(也可以通过SDK创建索引)

3、数据导入

插入部分测试数据(控制台样例中插入了1.08亿条(70天)数据,用户自己可以通过控制台插入少量测试数据);

表名:geo_track

摩托车编号轨迹点md5(mId + timestamp)(主键)时间店铺位置

id00001

f50d55bec347253c24dc9144dff3e3b7

1541103600000

30.30094,120.01278

表名:moto_user

摩托车编号(主键)摩托车颜色摩托车品牌摩托车租赁用户

id00001

银灰色

H牌摩托车

杨六

4、数据读取

数据读取分为两类:

主键读取(摩托车信息查询)

基于原生表格存储的主键列获取:getRow, getRange, batchGetRow等。主键读取用于索引(自动)反查,用户也可以提供主键(摩托车编号)单条查询的页面,查询速度极快。单主键查询方式不支持多维度检索;

索引读取(轨迹信息查询)

基于新SearchIndex功能Query:search接口。用户可以自由设计索引字段的多维度条件组合查询。通过设置选择不同的查询参数,构建不同的查询条件、不同排序方式;目前支持:精确查询、范围查询、前缀查询、匹配查询、通配符查询、短语匹配查询、分词字符串查询,并通过布尔与、或组合。

如【2018年11月01日,id00001号摩托车,行驶轨迹及违章查询】Query条件如下:

List mustQueries = new ArrayList();

List polygonList = Arrays.asList(//地理围栏,禁摩区域

"30.262348,120.092127",

"30.311668,120.079761",

"30.332413,120.129371",

...

);

String mId = "id00001";

Long timeStart = [2018-11-01时间戳];

Long timeEnd = [2018-11-02时间戳];

GeoPolygonQuery geoPolygonQuery = new GeoPolygonQuery();

geoPolygonQuery.setPoints(polygonList);

geoPolygonQuery.setFieldName("pos");

mustQueries.add(geoPolygonQuery);

TermQuery termQuery = new TermQuery();

termQuery.setFieldName("mId");

termQuery.setTerm(ColumnValue.fromString(request.getmId()));

mustQueries.add(termQuery);

RangeQuery rangeQuery = new RangeQuery();

rangeQuery.setFieldName("timestamp");

rangeQuery.setFrom(ColumnValue.fromDouble(timeStart, true);

rangeQuery.setTo(ColumnValue.fromDouble(timeEnd, false);

mustQueries.add(rangeQuery);

BoolQuery boolQuery = new BoolQuery();

boolQuery.setMustQueries(mustQueries);

阅读原文​​​​​​​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值