一种基于Redis的车辆轨迹信息的获取方式

2017-09-07 06:37:49徐芳芳张劲松
电子设计工程 2017年17期
关键词:数据表线程内存

徐芳芳,张劲松

(1.武汉邮电科学研究院 湖北 武汉 430070;2.武汉长江通信智联技术有限公司 湖北 武汉430070)

一种基于Redis的车辆轨迹信息的获取方式

徐芳芳1,张劲松2

(1.武汉邮电科学研究院 湖北 武汉 430070;2.武汉长江通信智联技术有限公司 湖北 武汉430070)

目前大多数公司主要是通过车载终端与GPS通信,获取GPS上面车辆轨迹信息,存入数据库。但针对运输企业来说,上述获取车辆轨迹信息的做法,会造成很大的经济负担。为此,文章提出了一种Java Timer和Guava cache结合的方式从Redis数据库上获取运输企业车辆的轨迹信息,存储到本地数据库,便于运输企业了解车辆信息,查询车辆历史轨迹。

Guava cache;Redis;Java定时器

随着我国经济的快速发展,车辆逐年增加,同时所造成的交通事故也在逐年上升,车辆监管越来越受人们的重视。目前,车辆管理中,获取车辆历史轨迹信息的方式有两种:一种是通过车载终端与GPS通信[1],在GPS接收端获取车辆轨迹信息,传回控制中心后存储到本地数据库;另一种是通过与上述这种有条件的企业合作,动态获取他们得到的车辆轨迹信息。

对于不是专门做GPS与车载终端通信的企业来说,一般会选取第二种方式。选用第二种方式时,有多种实现方法。如当需要车辆轨迹数据时,我们可以调用对方发送的接口直接获取数据;也可以主动去对方那里取数据,存到本地的数据库,当我们需要数据时,直接从本地数据库取数据。选用从对方发送的接口直接获取数据的方法,一般会受到异网段影响,造成较长时延,如果网络信号不好,可能造成信息丢失。而选用主动去对方那里取数据,存到本地的数据库时,我们需要考虑如何从对方那里直接取数据。可以使用中间数据库做桥梁。对方往里面存数据,我们不断取,然后存入本地数据库。其中比较好的可以做中间数据库的有coherence(可以实现java应用对象和数据的共享)和Redis,但使用coherence需要付费。

由上可知,采用第二种方式获取车辆轨迹信息大多会受到异网段传输时间过长,信息丢失,成本过高等影响。为了解决这种问题,本文在第二种方式的基础上提出一种基于Redis的车辆轨迹信息的获取的方式。

1 技术简介

Guava Cache[2-5]是一个全内存的本地缓存。它提供了一种把数据(key-value对)缓存到本地Java虚拟机(JVM)内存中的机制,适用于很少会改动的数据。Guava Cache为了限制内存占用,设有自动回收元素。

Redis是一个支持网络交互的、可基于内存也可持久化的Key-Value数据库。和Memcached类似,它拥有丰富的数据类型,支持存储的value类型相对更多,包括 string、list、set、zset(sorted set--有序集合)和hash(哈希类型)。

文中采取Redis与Guava Cache结合的方式,获取车辆轨迹信息[6-7],在提高应用性能的同时,大大提高响应速度。

2 功能实现

如图1,先从Redis上获取数据,在SSM(Spring+springMVC+mybatis)框架[15]上得到运输车辆轨迹信息,经过处理后,批量存入数据库。当需要查看mysql中存入的车辆历史轨迹信息对车辆数据进行分析时,由前台页面发出请求[13-14]后,从mysql中取出数据处理,展示在引入的地图[8-12]上。

图1 业务流程图

2.1 数据库的设计

1)mysql数据表的设计

根据需求设计Mysql数据表1,定义表名为gpsinfo,对应实体类型为GPSInfo。

表1 车辆信息表(gpsinfo)

其中,lat表示用GPS定位的车辆纬度,elat表示为项目所需经过纠偏后的纬度。gTime用GPS定位后采集到此车辆信息的时间。

2)Redis中结构的设计

由图1可知,从Redis数据库上取数据后,要存入Mysql对应字段的数据表,Redis中hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。如表2 Redis数据库上数据结构的设计,表字段基本与mysql数据表对应。

表2 Redis中hash数据结构设计key-value(hash)

2.2 车辆信息的获取和处理

图2 车辆信息存储流程图

如图2,为了使mysql数据库的数据与Redis数据库中的数据尽量达到同步,需要每个固定的一段时间去Redis数据库中的获取数据存入Mysql数据库,尽量达到二者数据的同步。这样的需求可以做一个线程,线程中做一个死循环,循环中执行的这个任务,每执行完一次让线程睡眠一段时间,这样就可以达到这个需求。最简单最便捷的方式是使用Java为我们提供的计时器的工具类,即Timer和TimerTask。Timer是一个普通的类,其中有几个重要的方法;而TimerTask则是一个抽象类,其中有一个抽象方法run(),通过run方法开启线程。我们使用Timer创建一个对象,然后使用这对象的schedule方法来完成这种定时操作。这种通过开启一个时间间隔线程,实时获取redis上车辆轨迹信息,基本上可以实现本地数据库数据与redis上数据的同步。具体步骤如下:

1)由图2可知,首先当程序开始的时候调用建立java Timer定时器,使用schedul()方法设定程序开始30s后调用线程中run()方法执行从redis上取数据并处理后存入数据库,然后每30秒执行一次,定时刷新,从而使mysqls的数据,与Redis的数据尽量达到同步。

2)启动定时器Timer后,开始在线程中处理数据。 使用 jedis.hgetAll ("gpsInfos")(jedis为 redis的java客户端),每次取出所有运输企业的车辆信息放在Map中,同时设置一个list集合 (数据类型为GPSInfo)。采用循环将Map中车辆信息分条取出,将每条数据放入与数据表对应的实体类gpsInfo(类型为 GPSInfo)中,设置获取时间 gpsInfo.setoTime(new Date()),设置车辆状态 gpsInfo.setStatus("在线"),同时采用纠偏工具将获取的GPS经纬度转换成对应地图的经纬度,根据经纬度和地址查询工具设置车辆的具体位置,将设置好的实体类gpsInfo放在对应list集合中,同时记录日志,方便后期查询。当循环结束后,判断list集合是否存在值,若有值将list中数据批量插入数据库。

3)上面2)是一种理想获取车辆历史轨迹的状态,实际上这里有两个问题,其一redis是一个内存数据库,对于程序来说,内存是有限且非常重要的,redis本身并没有自动回收机制,不断的向redis存数据会造成数据库的崩溃。其二从redis获取数据时,并不知道车辆是在线状态还是离线状态,仅当我们获取到车辆轨迹信息时,我们能判断此GPS采集时间车辆的状态为在线,如果没有获取到相关车辆轨迹信息,我们怎样设置车辆为离线呢?为了解决以上两种问题,我们引入本地缓存Guava cache。

定义一个全局变量private LoadingCache<String,GPSInfo> gpsInfosGuaveCache。程序启动时自动加载的一个 LoadingCache类型的函数gpsInfosGuaveCache()并赋值给全局变量gpsInfosGuaveCache,在2)循环中设置好实体类gpsInfo之后,按照Key-value数据类型将对应车辆信 息按车牌号 存入 Guavacache中 :gpsInfosGuaveCache.put (carNum,gpsInfo)。 由 于Guava cache是本地缓存,为了避免它占用过多的内存,本文使用它自带的回收元素回收内存。在函数gpsInfosGuaveCache()中,先设置基于大小移除的方法 :CacheBuilder.newBuilder().maximumSize(50000)当存入全局变量gpsInfosGuaveCache的key值数量接近于50000时,Guave Cache就会把不常用的键值对从cache中移除,同时配合基于时间的移除:expireAfterWrite (30,TimeUnit.SECONDS),当超过30s时,对应车辆key值没有数据更新,移除此key值。在移除数据时设置一个Guava cache自带的监听器,当监听到key值移除时,删除redis数据库上对应的此键值:jedis.del("gpsInfos",gpsInfo.getKey()),并在监听函数中设置车辆离线状态,将设好的数据更新到mysql中。这样使用Guava cache即对redis进行了优化,又设置了接收车辆的相关数据。

3 数据展示

如图3所示:(下面车牌号为修改过的测试用的车牌号)。

为了验证车辆历史轨迹是否正确,本文采用百

图3 车辆轨迹回放

度地图展示数据。为了精确的找到车辆在一段时间 的历史轨迹。需要利用ajax技术的将车牌号、车牌颜色、车辆运行的时间段发送到后台,进行请求,请求成功后,判断是否有数据返回,若没有数据给出"没有查询到相关车辆信息!"提示信息,若有数据,将查询到的车辆轨迹信息,通过循环的以new BMap.Point(lon,lat)方式放在 pointArray[i]数组中,使用Polyline函数,将数组中的车辆经纬度,按照先后顺序连接起来。最后设置一个功能函数,便于查看车辆在地图上的运行轨迹。

4 结束语

文章介绍了一种基于Redis的车辆轨迹信息的获取技术,在优化性能的同时提高了响应速度,同时引入百度地图API观察获取到的数据,直观、简单、方便运输企业查看运输车辆历史轨迹,了解分析车辆在运行中的信息。

[1]毛志宇,张正,曹玉志.基于RFID与GPS的岩土运输车辆管理系统的研究与开发 [J].信息化建设,2016(3):353.

[2]王心妍.Memcached和Redis在高速缓存方面的应用[J].无线互联科技,2012(9):8-9.

[3]唐诚.Redis数据库在微博系统中的实践[J].厦门城市职业学院学报,2012,14(3):55-59.

[4]曾超宇,李金香.Redis在高速缓存系统中的应用[J].微型机与应用,2013(12):11-13.

[5]张景云.基于Redis的矢量数据组织研究[D].南京:南京师范大学,2013.

[6]范建永,龙明,熊伟.基于HBase的矢量空间数据分布式存储研究 [J].地理与地理信息科学,2012,28(5):39-42.

[7]唐建智.基于云计算的海量空间信息存储与计算研究 [D].北京:中国科学院遥感应用研究所,2012.

[8]邵应泉.基于百度地图API实现自动气象站点信息显示[J].电脑知识与技术,2013(27):6062-6063.

[9]沈娣丽,上官同英,孟雅俊,等.Zigbee和百度地图API在农田信息采集系统中的应用[J].中国农机化,2012(4):184-188.

[10]王红崧,周海晏.基于百度地图API的旅游地理信息系统开发[J].现代计算机(专业版),2012(23):60-63.

[11]岳泉.基于谷歌地图的车辆远程监控系统的设计与实现[D].武汉:武汉理工大学,2013.

[12](美)泽卡斯 (Zakas,N.C.),著.JavaScript高级程序设计[M].北京:人民邮电出版社,2012.

[13]林国,李伟超.基于AJAX的富互联网应用框架研究[J].实验室研究与探索,2012,31(7):92-97.

[14]周杨.AJAX应用的典型设计模式[J].计算机系统应用,2011(1):128-132.

[15]薛峰,梁锋,徐书勋,等.基于Spring MVC框架的Web研究与应用[J].合肥工业大学学报:自然科学版,2012(3):337-340.

A method of obtaining vehicle track information based on Redis

XU Fang-fang1,ZHANG Jin-song2
(1.Wuhan Research Institute of Posts and Telecommunications,Wuhan 430070,China;2.Wuhan YCIG iLink Technology Company Limited,Wuhan 430070,China)

Most companies get in the GPS[1]vehicle trace information mainly through the vehicle terminal and GPS communicated,to store in database.For transportation enterprises,the above method to the acquisition of vehicle trace information,will generate a large economic burden.Therefore,this paper proposes a combination way of Java Timer and Guava cache to get the vehicle trace information of transport enterprise from Redis[2-5]database.The aim to make transport enterprise get vehicle trace information and query vehicle trajectory[6].

Guava cache; Redis; Java timer

TN02

A

1674-6236(2017)17-0054-04

2016-07-18稿件编号:201607131

徐芳芳(1991—),女,湖北孝感人,硕士研究生。研究方向:通信与信息工程、软件设计。

猜你喜欢
数据表线程内存
湖北省新冠肺炎疫情数据表
党员生活(2020年2期)2020-04-17 09:56:30
“春夏秋冬”的内存
当代陕西(2019年13期)2019-08-20 03:54:22
基于列控工程数据表建立线路拓扑关系的研究
浅谈linux多线程协作
环球市场(2017年36期)2017-03-09 15:48:21
图表
基于VSL的动态数据表应用研究
河南科技(2014年24期)2014-02-27 14:19:25
基于内存的地理信息访问技术
Linux线程实现技术研究
么移动中间件线程池并发机制优化改进
上网本为什么只有1GB?