一种基于分区缓存的海量数据检索方法
2014-06-23金晋杨明金华
金晋,杨明,金华
(1.中国人民公安大学警务实战训练部,北京 100038;2.中国人民公安大学网络安全保卫学院,北京 100038; 3.中国人民公安大学警务信息工程学院,北京 100038)
一种基于分区缓存的海量数据检索方法
金晋1,杨明2,金华3
(1.中国人民公安大学警务实战训练部,北京 100038;2.中国人民公安大学网络安全保卫学院,北京 100038; 3.中国人民公安大学警务信息工程学院,北京 100038)
针对交通综合应用系统中车辆数据的采集频率高、汇集速度快的特点,提出一种海量数据的分区缓存检索方法。该方法采用分区表技术,通过并发检索和缓存机制,实现了海量数据的快速检索。通过试验分析,该方法可以有效提高车辆数据的检索速度。
海量数据;分区表;缓存;检索
0 引言
为加强科技强警建设,全国各地启动了交通综合应用系统建设项目,通过在一定范围内布设一定数量的监控点,利用车辆信息采集技术实时监控各路段或路口的机动车通行情况,并将各监控点采集的车牌及图片等基础数据实时传送至中心信息系统,对其进行存储、计算、比对等处理,实现了对过往车辆、嫌疑车辆和违法车辆的实时查控,为公安各警种快速有效地打击涉车违法行为提供了强有力的技术手段,真正实现了科技强警的目标。
由此,中心信息系统快速有效的处理车辆数据,将有助于提高交通安全执法的时效性和防控的有效性。而车辆数据具有采集频率高、上传实时性强、数据量增长快等特点,很快从数量和容量上累积为海量数据[1]。
针对海量数据,在应用层面可通过多种途径和方法对数据存储和检索进行优化。本文针对车辆信息这一典型海量数据,提出了一种分区存储和基于缓存机制的并发检索方法。
1 海量数据的分区并发检索方法
车辆信息具有采集频率高、携带信息丰富、上传实时性强、修改删除较少等特点,随着时间的推移,其数据量迅速增长,可谓海量数据。
本文对车辆信息的存储和检索进行了优化。对于存储,采用分区[2]技术,对超大表进行分区,实现了逻辑上的分布式存储。对于检索,采取分区并发检索的方式,即使用多线程并发方式检索分区表,而非主表;采用缓存机制,记录每个用户的查询结果,以减少后续检索时间。
1.1 基于分区表的存储策略
将采集的车辆信息以结构化数据存储于关系型数据库中,数据库表为VehicleInfo。随着时间的推移,车辆信息将迅速增长,VehicleInfo表逐渐生成为超大表。对于超大表的增加、删除、查询、修改操作,即使对条件等进行限制,均要对全表进行操作,如果数据量巨大,如几千万条、甚至上亿条数据,则进行全表操作将会对数据库性能造成严重影响。因此对这种超大表可采用分区表技术,以提高性能。分区表是按照特定方式逻辑划分大表,最终将其数据部署到多个相对较小的分区段中。当执行SQL语句访问分区表时,服务器进程可以直接访问某个或某几个分区段,而不需要访问整张大表的全部数据,从而提高性能[3]。
车辆信息表VehicleInfo中的主要字段有:监控点编码deviceID、车牌号码vehiclePlate、经过时间passTime、号牌颜色plateColour、号牌种类plateType、行驶状态runState、车身颜色vehicleColour等。其中,deviceID、vehiclePlate、passTime 3个维度的信息是车辆检索时用户较多关注的几个信息,选择pass-Time作为分区字段,以天作为分区边界,能较好地控制每个分区的数据量。分区表的结构与主表VehicleInfo一样,命名为VehicleInfoyyyyMMdd,它由两部分组成,主表名VehicleInfo+yyyyMMdd(年月日)。另外,选择deviceID、vehiclePlate这两列创建复合索引,可加快数据的检索速度。
分区表的建立,虽然从物理上对车辆数据进行了分离,但从逻辑结构上仍然属于一个整体,看不出有什么变化,这样便于制定灵活的检索方案。
1.2 基于分区缓存机制的检索策略
模型中的user、cache、PT分别表示用户、缓存和分区表。当用户发起检索指令时,服务器将在内存中为该用户创建哈希表结构,用于缓存其此次查询的车辆数据,然后采用多线程并发查询的方式从多个数据库分区表中获取结果,将查询结果更新于该用户相应分区表数据的缓存中,用于返回结果。
图1 基于缓存机制的分区检索数据的模型
1.2.1 缓存中的哈希表结构
缓存中的哈希表结构[4],能够保证每个用户只有一份缓存数据。
Map〈String,Set〈VehicleDataCache〉〉中的键为用户ID、值为分区表结果集(VehicleDataCache)列表,它在缓存中维护用户的查询结果集。
每个VehicleDataCache结果集中的含义如下:
partitionTableName:分区表名称,用于标识记录的是哪个分区表返回的结果集;
curResultList:缓存部分结果,记录返回结果列表;
totalNum:总共数量,该分区表中满足条件的车辆信息总数;
curBPos:当前结果在表数据结果集中的起始位置,与curEPos结合使用,用于计算分页处的结果位置;
curEPos:当前结果在表数据结果集中的终止位置;
cacheMaxNum:设置缓存最大数据,该数据可根据服务器的内存大小、用户并发数以及查询响应时间等因素进行预先设置。
flag:是否查询完毕,标识当前分区表的查询结果集是否已经返回。
这些属性信息,将用于计算检索和返回的策略。1.2.2方法描述
判断检索方式,如果是用户的首次查询,则执行首次查询流程;如果是用户的后续分页查询,则执行分页查询流程。
首次查询:
(1)根据用户ID查询缓存中是否有该用户上次查询的车辆数据,如果有,则清除;
(2)查看是否有上次未停止的查询线程,如果有,则停止;
(3)在缓存中创建哈希表,建立用户和每个分区表返回查询结果集等信息的映射关系;
(4)根据查询条件中的开始时间、结束时间和分区表间隔时间,获得将要查询的分区表,将获得的分区表名放入查询列表;
图2 缓存中的哈希表结构
(5)对查询列表中的分区表执行多线程查询任务:从数据库分区表中获取指定条件指定数量的车辆信息;
(6)获得分区表的查询结果,更新缓存中的车辆数据,更改缓存标识;
(7)等待第一个分区表查询完成后,如果结果满足第一页的数据量,则直接返回,如果不满足,则继续等待第二个分区表,以此类推;
(8)当首页结果返回后,获取后续分区表查询结果的线程仍在执行,直到获取所有分区表的查询结果。
示例:user1检索2013年9月1日~2013年9月15日的车辆信息,系统的处理策略:
(1)根据开始时间2013年9月1日、结束时间2013年9月15日和分区表间隔,获得即将检索的分区表:VehicleInfo20130915、VehicleInfo20130914、……、VehicleInfo20130902、VehicleInfo20130901,共16张分区表。
(2)在内存的哈希表结构中创建基于user1的车辆信息缓存数据,即Map<String,Set<Vehicle-DataCache>>结构中放入键为user1、值为16个记录分区表结果集列表的映射关系。
(3)对每个分区表,采取多线程并发检索方式,从数据库表中获取指定条件、一定数量的车辆信息。
(4)将从每个分区表中检索回的数据分别放入分区表结果集,供后续翻页使用。
(5)当分区表中的数据不满足当前分页条件时,则会根据VehicleDataCache缓存结构中的属性信息,决定检索和返回结果的策略。
分页查询:
(1)根据用户ID查询缓存中是否有该用户查询的车辆数据,如果有,则继续;
(2)根据查询页数和每页显示数量,计算从哪些分区表获取数据;
(3)根据计算结果,从缓存中获取指定分区表的车辆数据;
(4)如果当前缓存分区表的结果集满足分页条件,则直接返回;否则根据当前分区表中剩余缓存数据与结果总数的关系,计算是需要继续从数据库中查询该分区表,还是从下一个分区表中获取数据,以此类推。
2 性能分析
以应用系统汇集的车辆数据量作为参考,对基于缓存机制的分区并发检索数据的方法进行验证,并与传统检索方式进行对比。
以总量为2 000万条车辆信息的数据为例,实验结果如下:
图32 000万条数据检索时间对比
图中的横坐标为显示页数,纵坐标为检索时长。从实验结果可以看出,在翻页时,如果从缓存中获取结果,则本文的检索方法耗时一般小于100 ms,而传统检索方法的耗时在7 000 ms左右;而当缓存结果集不满足返回结果时,则本文检索方法也比传统检索方法的性能提升了一倍。
3 结语
本文针对车辆信息这一典型海量数据,给出了一种分区存储和基于缓存机制并发检索方法。该方法建立在分布式存储基础之上,对数据进行并发检索,并将部分检索结果集存放于缓存中,实现了海量数据的快速检索。通过实验比对分析,该方法可以有效提高车辆数据的检索速度。
[1]毛杰.海量数据库查询优化研究[J].软件导刊,2010 (5):184-186.
[2]Christian Antognini.Oracle性能诊断艺术[M].童家旺,等,译.北京:人民邮电出版社,2009.
[3]陈俊.分区表及物化视图技术在查询分析中的应用[D].武汉:湖北大学,2010.
[4]胥攀,刘胜利.一种改进的分段哈希算法[J].计算机工程,2014(5):17.
(责任编辑 陈小明)
TP31
北京市支持中央高校共建项目-青年英才计划(YEPT1367)资助。
金晋(1974—),女,吉林长春市人,讲师。研究方向为计算机应用。