一种内存存储特定设备端口状态数据的方法与流程

文档序号:12364062阅读:172来源:国知局
本发明涉及一种内存存储特定设备端口状态数据的方法。特别是涉及一种支持快速查询状态数据的内存存储特定设备端口状态数据的方法。
背景技术
:当今信息化已经进入了大数据时代,网络服务越来越丰富,网速大幅度提升,网络业务、办公等极大方便,人们越来越多活动依赖网络。使得网络流量急剧增加,网络设备数据的处理、存储就显得格外重要。对于动辄TB级别的数据量,常规的关系型数据库也能够做到很好的存储。更新不频繁的情况下,常规的关系型数据库的查询速度也很好。但对于数据量巨大,每天上亿条数据的更新存储,并且同时要求快速的查询,常规的关系型数据库则无法保证效率。鉴于此,如何既要很好的结构存储,又要保证稳定快速的查询,就显得十分紧迫。一些NoSQL数据库虽然能做到很好的存储和查询数据,但数据结构化方面比较单一,只能支持简单的key=value字符存储方式。技术实现要素:本发明所要解决的技术问题是,提供一种支持快速查询状态数据的内存存储特定设备端口状态数据的方法。本发明所采用的技术方案是:一种内存存储特定设备端口状态数据的方法,首先启动一个内存状态数据服务进程,进程永久运行,状态服务进程执行以下步骤:1)申请两份缓存集:第一缓存集和第二缓存集;每个缓存集包括:设备Hash列表缓存、设备信息缓存、端口信息缓存和状态数据缓存;第一缓存集存放前一个存储周期设备状态数据,第二缓存集存放当前存储周期设备状态数据;申请全局访问控制读写锁,进入下一步骤;2)连接数据库,查询采集任务表,读取设备采集粒度信息,生成设备采集粒度缓存,进入下一步骤;3)启动设备采集粒度缓存更新线程,周期性读取采集任务表并更新设备采集粒度缓存,进入下一步骤;4)启动数据切换线程,每个存储周期末,切换第一缓存集和第二缓存集中的数据,切换后并清空第二缓存集中的数据,进入下一步骤;5)启动历史数据初始化线程,连接数据库,从设备状态数据表中读取前一个存储周期开始时间到当前时间的设备状态数据,并存入缓存,进入下一步骤;6)启动HTTP监听服务,等待接收处理远程数据查询和数据更新请求。本发明的一种内存存储特定设备端口状态数据的方法,具有如下特点:1.采集清晰的级别划分存储状态数据,设备级别数据、端口级别数据、时间级别数据;2.采用Hash表或数组存储不同级别数据,从而可以使用hashcode或自然索引数组下标快速定位数据;3.存储内存重复利用,不需要重复频繁申请释放内存;4.随着数据量的变化,可以做到占用内存大小的自适应,避免内存浪费。附图说明图1是数据内存存储示意图;图2是三个级别数据关系示意图。具体实施方式下面结合实施例和附图对本发明的一种内存存储特定设备端口状态数据的方法做出详细说明。本发明的一种内存存储特定设备端口状态数据的方法,是根据数据统计划分不同几倍,包括设备级别数据、端口级别数据、时间点级别数据,各个级别数据使用Hash表或数组方式存储,上一级别数据直接引用下一级数据,从而实现数据结构化存储,同时保证了高效的查询服务。此外,数据缓存一次申请重复利用,避免频繁的内存申请释放操作。长时间的服务,随着数据量的变化,可以自动增减内存占用量,达到内存自适应效果。本发明的一种内存存储特定设备端口状态数据的方法,首先启动一个内存状态数据服务进程,进程永久运行,状态服务进程执行以下步骤:1)申请两份足够大的缓存集:第一缓存集和第二缓存集;每个缓存集包括:设备Hash列表缓存、设备信息缓存、端口信息缓存和状态数据缓存;第一缓存集存放前一个存储周期设备状态数据,第二缓存集存放当前存储周期设备状态数据;申请全局访问控制读写锁,进入下一步骤;所述的设备Hash列表缓存是一个Hash表,根据设备唯一标识进行哈希运算得到设备hashcode,使用设备hashcode可以直接定位设备Hash表中元素,Hash表中每个元素存储一个指针,指针指向一个链表头节点,链表每个节点元素值是一个设备信息指针,指向设备信息缓存中某一位置。所述的设备信息缓存是一个存储设备信息的数组,当需要申请新的设备信息内存时,则从设备信息缓存中分配一个数组元素用来存储设备信息;设备信息包括:设备唯一标识、设备状态采集粒度、设备每个端口存储状态数据值最大数量、设备端口状态数据Hash列表和设备级线程锁;其中设备端口状态数据Hash列表每个元素存储一个指针,指针指向一个端口信息链表头节点,链表中每个节点元素值是一个端口信息指针,指向端口信息缓存中某一位置。所述的端口信息缓存是一个存储端口信息的数组,当需要申请新的端口信息内存时,则从端口信息缓存中分配一个数组元素用来存储端口信息;端口信息包括:端口的hashcode、端口的业务标记、端口状态数据数组、端口状态数据数组已使用的最大下标和端口级线程锁;其中端口的hashcode是根据端口业务标记执行哈希计算得到;端口状态数据数组是状态数据缓存中的一段连续内存,数组每个元素是一组状态信息,所述的状态信息包括所有要存储的状态数据。2)连接数据库,查询采集任务表,读取设备采集粒度信息,生成设备采集粒度缓存,进入下一步骤;所述的连接数据库,查询采集任务表,读取设备采集粒度信息,生成设备采集粒度缓存,是根据配置中的数据库访问参数连接到数据库,读取采集任务表中设备采集粒度信息,并存储到设备采集粒度缓存。其中采集任务表中设备采集粒度信息如表1,包括:设备唯一标识和设备采集粒度(次/N分钟);设备采集粒度缓存是一个Hash数组,根据设备唯一标识进行哈希计算得到设备hashcode,根据设备hashcode定位设备采集粒度在Hash数组中的存储位置,数组元素中存放的是设备采集粒度数值。表1设备唯一标识设备采集粒度(次/N分钟)x.x.x.x1M(1分钟)x.x.x.x5M(5分钟)…………3)启动设备采集粒度缓存更新线程,周期性读取采集任务表并更新设备采集粒度缓存,进入下一步骤;包括启动一个新线程负责周期性的更新设备采集粒度缓存,其中线程执行步骤如下:(1)线程启动,进入休眠,一个设备采集粒度缓存更新周期后,执行下一步;(2)连接数据库,进入下一步;(3)创建一个临时的设备采集粒度缓存,进入下一步;(4)从数据库采集任务表中循环读取所有的设备采集粒度信息,并将读取的采集粒度信息放入临时的设备采集粒度缓存,进入下一步;(5)使用临时的设备采集粒度缓存替换旧的设备采集粒度缓存,并释放旧的设备采集粒度缓存,进入下一步;(6)断开数据库链接,执行第(1)步。4)启动数据切换线程,每个存储周期末,切换第一缓存集和第二缓存集中的数据,切换后并清空第二缓存集中的数据,进入下一步骤;包括:启动一个新的线程负责在每个存储周期末切换缓存集数据并清空第二缓存集中的数据,第二缓存集用来存储新一存储周期的数据,其中线程执行步骤如下:(1)线程睡眠,1分钟后,执行下一步骤;(2)判断时间是否是一个存储周期结束,是,进入下一步骤,否,第(1)步;(3)获得全局访问控制写锁,进入下一步骤;(4)创建临时的设备Hash列表缓存指针、设备信息缓存指针、端口信息缓存指针、状态数据缓存指针,分别指向第一缓存集中的设备Hash列表缓存、设备信息缓存、端口信息缓存、状态数据缓存,进入下一步骤;(5)将第二缓存集中的设备Hash列表缓存、设备信息缓存、端口信息缓存、状态数据缓存移到第一缓存集中,进入下一步骤;(6)将第(4)步中创建的临时的设备Hash列表缓存指针、设备信息缓存指针、端口信息缓存指针和状态数据缓存指针指向的缓存内的数据清空后,将所述的设备Hash列表缓存指针、设备信息缓存指针、端口信息缓存指针和状态数据缓存指针移动到第二缓存集中,用来存储新一周期的设备状态数据,进入下一步;(7)释放全局访问控制写锁,执行第(1)步。5)启动历史数据初始化线程,连接数据库,从设备状态数据表中读取前一个存储周期开始时间到当前时间的设备状态数据,并存入缓存,进入下一步骤;包括启动一个新线程负责从数据库设备状态数据表中读取前一个存储周期开始时间到当前时间范围内的设备状态数据,其中线程执行步骤如下:(1)连接数据库,执行下一步骤;(2)读取设备状态数据表,取出从前一个存储周期开始时间到当前时间的一条设备状态数据,如果存在一条设备状态数据,执行下一步骤,如果不存在一条设备状态数据,执行步骤(6);(3)分解第(2)步中取出的一条设备状态数据,得到设备唯一标识、端口业务标记、时间和状态信息,根据时间判断数据应该存储在和一缓存集中,还是第二缓存集中,找到对应缓存集的设备Hash列表缓存,对设备唯一标识进行哈希运算得到设备hashcode,根据设备hashcode在设备Hash列表缓存查找到设备信息链表,根据设备唯一标识在设备信息链表中查找设备信息,如果存在设备信息,进入下一步骤,如果不存在设备信息,则从设备信息缓存中申请一份设备信息内存,存入设备信息,根据设备唯一标识查找设备采集粒度缓存得到设备采集粒度,将采集粒度存储到设备信息,并使用每天分钟总数除以采集粒度得到设备每个端口存储状态数据值最大数量,将新申请的设备信息内存放在设备信息链表头节点位置,进入下一步骤;(4)根据第(3)步分解第(2)步中取出的一条设备状态数据得到的端口业务标记,通过哈希运算得到端口hashcode,根据端口hashcode在设备端口状态数据Hash列表中查找到端口信息链表,根据端口业务标记在端口信息链表中查找端口信息,如果存在端口信息,进入下一步骤,如果不存在端口信息,则从端口信息缓存中申请一份端口信息内存,存入端口信息,并根据第(3)步中得到的设备信息中设备每个端口存储状态数据值最大数量在状态数据缓存中申请足够大的连续内存,将连续内的指针赋值给端口信息的端口状态数据数组,将新申请的端口信息内存放在端口信息链表头节点位置,进入下一步;(5)根据第(3)步分解第(2)步中取出的一条设备状态数据得到的时间,使用时间所在当天的分钟数除以设备信息中的设备采集粒度得到状态信息在端口状态数据数组中的存储位置,得到状态信息内存,将第(3)步分解第(2)步中取出的一条设备状态数据得到的时间、状态信息存入状态信息内存,执行第(2)步;(6)断开数据库链接,结束线程。6)启动HTTP监听服务,等待接收处理远程数据查询和数据更新请求。包括启动一个网络HTTP监听端口,时刻等待接收并处理远程数据查询和数据更新HTTP访问请求,其中监听处理步骤如下:(1)启动一个网络HTTP监听端口,执行下一步骤;(2)等待远程访问请求到来,当一个请求到来时,执行下一步骤;(3)启动一个新的请求处理线程,负责处理访问请求,第(2)步。第(3)步所述的启动一个新的请求处理线程,负责处理访问请求,是启动一个新的线程,读取访问请求参数,并根据参数进行处理和响应请求,包括:(ⅰ)读取请求访问参数,执行下一步骤;所述的请求访问参数,包括查询请求访问参数和更新请求访问参数两种。所述的查询请求访问参数包括:请求类型、端口唯一标识列表、查询数据时间范围开始时间、查询数据时间范围结束时间;所述的端口唯一标识列表包含多个端口唯一标识,每个端口唯一标识包括:端口业务标识、设备唯一标识。所述的更新请求访问参数包含多个数据单元,每个数据单元包括:端口唯一标识、状态信息、时间。其中请求格式与参数格式如下:(a)数据查询请求的格式与参数请求格式:type=select&bus_pri_key=key1,key2,…&start_time=yyyy-mm-dd_hh:mi:ss&end_time=yyyy-mm-dd_hh:mi:ss请求参数:type:查询类型,值固定为select;bus_pri_key:端口唯一标识列表,包括多个端口唯一标识,端口唯一标识使用“,”分割,其中端口唯一标识格式为“端口业务标记_设备唯一标识”start_time:查询数据时间范围的开始时间,格式为“yyyy-mm-dd_hh:mi:ss”end_time:查询数据时间范围的结束时间,格式为“yyyy-mm-dd_hh:mi:ss”(b)数据更新请求格式与参数请求格式:data=<data_unit>;<data_unit>;…请求参数:data:要更新的data_unit列表,data_unit之间使用“;”分隔data_unit格式:bus_pri_key,status_data,timebus_pri_key:端口唯一标识列表,包括多个端口唯一标识,端口唯一标识使用“,”分割,其中端口唯一标识格式为“端口业务标记_设备唯一标识”status_data:端口状态信息time:状态统计时间,格式为“yyyy-mm-dd_hh:mi:ss”(ⅱ)解析请求参数,判断请求是查询请求或是更新请求,如果是查询请求,执行数据查询处理逻辑,如果是更新请求,执行数据更新处理逻辑,进入下一步骤;所述的数据查询处理逻辑,包括:(a)分析查询数据时间范围开始时间,查询数据时间范围结束时间,如果开始时间晚于当前时间,或者结束时间早于前一存储周期开始时间,或者开始时间晚于结束时间,结束处理,否则,创建端口信息临时链表,执行下一步骤;(b)取出请求参数端口唯一标识列表中的一个端口唯一标识,如果存在一个端口唯一标识,执行下一步,如果不存在一个端口唯一标识,执行第(e)步;(c)分解第(b)步取出的端口唯一标识得到端口业务标记和设备唯一标识,根据查询数据时间范围开始时间,查询数据时间范围结束时间判断要请求的数据是缓存集一中数据,还是缓存集二中数据,找到对应缓存集的设备Hash列表缓存,对设备唯一标识进行哈希运算得到设备hashcode,根据设备hashcode在设备Hash列表缓存查找到设备信息链表,根据设备唯一标识在设备信息链表中查找设备信息,如果存在设备信息,进入下一步,如果不存在设备信息,执行第(b)步;(d)根据第(c)步中分解第(b)步取出的端口唯一标识得到的端口业务标记,通过哈希运算得到端口hashcode,根据端口hashcode在第(c)步查找到的设备信息中的设备端口状态数据Hash列表中查找到端口信息链表,根据端口业务标记在端口信息链表中查找端口信息,如果存在端口信息,将查找到的端口信息加入到第(a)步中创建的端口信息临时链表,进入下一步骤,如果不存在端口信息,执行第(b)步;(e)取出第(a)步中创建的端口信息临时链表中的一个端口信息,如果存在一个端口信息,读取端口信息的端口状态数据数组,将状态数据数组中状态信息时间在查询数据时间范围开始时间,查询数据时间范围结束时间范围内的设备状态数据发送到HTTP客户端,结束处理,如果不存在一个端口信息,释放端口信息临时链表,结束处理。所述的更新处理逻辑,包括:(a)取出请求参数中的一个数据单元,如果存在一个数据单元,执行下一步,如果不存在一个数据单元,结束处理;(b)分解第(a)步中取出的一个数据单元,得到设备唯一标识、端口业务标记、时间、状态信息,根据时间判断数据应该存储在第一缓存集中,还是第二缓存集中,如果既不是第一缓存集,也不是第二缓存集,丢弃取出的数据单元,执行第(a)步,否则,找到对应缓存集的设备Hash列表缓存,对设备唯一标识进行哈希运算得到设备hashcode,根据设备hashcode在设备Hash列表缓存查找到设备信息链表,根据设备唯一标识在设备信息链表中查找设备信息,如果存在设备信息,进入下一步,如果不存在设备信息,则从设备信息缓存中申请一个设备信息内存,存储设备信息,根据设备唯一标识查找设备采集粒度缓存得到设备采集粒度,将采集粒度存储到设备信息中并使用每天都分钟总数除以采集粒度得到设备每个端口存储状态数据值最大数量,将新申请的设备信息内存放在设备信息链表头节点位置,进入下一步骤;(c)根据第(b)步分解第(a)步中取出的一个数据单元得到的端口业务标记,通过哈希运算得到端口hashcode,根据端口hashcode在设备端口状态数据Hash列表查找到端口信息链表,根据端口业务标记在端口信息链表中查找端口信息,如果存在端口信息,进入下一步骤,如果不存在端口信息,则从端口信息缓存中申请一份端口信息内存,存入端口信息,并根据第(b)步中得到的设备信息中设备每个端口存储状态数据值最大数量在状态数据缓存中申请足够大的连续内存,关联连续内存到端口信息的端口状态数据数组,将新申请的端口信息内存放在端口信息链表头节点位置,进入下一步;(d)根据第(b)步分解第(a)步中取出的一个数据单元得到的时间,使用时间所在当天的分钟数除以设备信息中的设备采集粒度确定状态信息在端口状态数据数组中的存储位置,得到状态信息内存,将分解第(a)步中取出的一个数据单元得到的时间、状态信息存入状态信息内存,执行第(a)步。(ⅲ)关闭HTTP链接,结束线程。如图1所示,是数据内存存储示意图,设备Hash列表缓存包含设备信息多个链表,设备信息链表包含多个设备信息,每个设备信息包含一个设备端口信息Hash表,设备端口信息Hash表包含多个端口信息链表,端口信息链表包含多个端口信息,每个端口信息包含一个时间序列的状态信息数组,数组中每个元素是一组状态信息数据。如图2所示,是三个级别数据关系示意图,设备级数据是以设备为单位的数据存储,包含设备唯一标识、设备状态采集粒度、设备每个端口存储状态数据值最大数量、设备端口状态数据Hash列表、设备级线程锁;端口级数据是以端口为单位的数据存储,包含端口的hashcode、端口的业务标记、端口状态数据数组、端口状态数据数组已使用的最大下标、端口级线程锁;时间级数据是以设备状态采集粒度为单位的数据存储,其中数据是某一时刻状态信息数据。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1