一种基于哈希表的路由器运行数据缓存方法及系统与流程

文档序号:12665703阅读:243来源:国知局
一种基于哈希表的路由器运行数据缓存方法及系统与流程
本发明涉及路由器运行信息处理技术,尤其涉及一种基于哈希表的路由器运行数据缓存方法,还涉及一种实现该方法的系统。
背景技术
:随着无线通信传输速度的飞速提高,资费的不断降低,无线路由器被广泛应用在电力、水利、物流等各个行业,有效提高了各个行业的效率。在这些行业应用中,无线路由器具有分布广泛、数量众多的特点,M2M管理云平台用于实现对这些无线通信路由器的设备远程管理。提供运行状态监控、参数远程修改查看,远程升级等功能。无线路由器运行数据,包括当前在线状态,网络模式,信号强度,流量统计等。这些数据由路由器在运行过程中,定期上报。一般10-60秒上报一次。在中小规模项目中,例如接入2000台设备的系统,10秒钟上报一次,每秒系统需要处理200个运行状态数据上报,普通关系型数据库即可很好满足需求。当系统接入数十万甚至百万台设备后,每秒需要处理数万个运行状态数据包,数据库系统无法提供每秒数万次的更新能力。特别是对于数百万台设备接入,平均每秒收到的数据上报指令最大约数十万条。针对每秒几十万次的更新频率性能需求,普通数据库或者文件系统,均无法满足需求。部分内存数据库可以提供约10万次每秒的更新能力,但需要安装和配置额外的组件,增加了项目部署和维护的成本,而且性能上也无法完全满足超大型系统需求。技术实现要素:为解决现有技术中的问题,本发明提供一种基于哈希表的路由器运行数据缓存方法,还提供了一种实现上述方法的系统。本发明基于哈希表的路由器运行数据缓存方法包括如下步骤:S1:在与路由器连接的服务器内存中创建哈希表;S2:收到路由器运行数据上报指令,通过哈希函数计算得到所述路由器在服务器内存中对应的节点的哈希表位置;S3:在所述哈希表位置查找是否存在所述路由器的节点信息,如果存在,更新该节点信息;如果不存在,新增节点和节点对应的哈希表索引,并将上报的运行数据存储在新增的节点上;S4:将内存数据写入数据库。本发明作进一步改进,在步骤S1中,创建哈希表的方法为:创建一个容量为N的数组指针,所述指针指向一个数组,该数组是由N个节点的首地址组成。本发明作进一步改进,数组指针的容量N根据路由器的数量配置。本发明作进一步改进,在步骤S2中,路由器标示符的后8个字节为路由器的唯一序列号,所述哈希函数是由路由器序列号的标示符决定,哈希函数算法如下:A1:对路由器标示符的后8个字节中,每两个字节按照按十六进制文本转二进制,转为一个字节,得到4个字节的二进制数值;A2:将步骤A1得到的二进制数值强制赋值给unsignedint,得到路由器唯一id号;A3:将步骤A2得到的id号对哈希表容量取余,即得到哈希表位置值。本发明作进一步改进,在步骤A3中,每个哈希表位置采用链表保存数据,当得到哈希表位置后,对链表中每个节点的id号进行对比,如果与请求上报指令的路由器的id号相同,则找到该路由器的节点,否则,在链表尾端新增节点。本发明作进一步改进,服务器收到路由器运行数据上报指令,更新数据的具体方法为:S301:开始处理上报数据;S302:判断路由器的参数是否合法,如果是,根据路由器的标示符得到id,如果否,执行步骤S35;S303:获取哈希表位置,在哈希表位置的链表循环查找id;S304:判断是否找到id,如果是,更新路由器运行数据,如果否,新增节点,将运行数据给新增节点赋值,加入链表尾端;S305:上报处理结束。本发明作进一步改进,服务器提供对外读取路由器运行数据的接口,用户能够通过该接口读取内存中的数据,读取内存中路由器运行数据的方法包括如下步骤:S311:开始读取数据;S312:根据路由器的标示符的到id;S313:获取哈希表位置,在哈希表位置的链表循环查找id;S314:判断是否找到id,如果是,读取路由器运行数据,如果否,读取失败;S315:读取结束。本发明作进一步改进,在步骤S4中,内存数据定期写入数据库,具体实现方法为:S41:更新开始,内存每更新一次数据,更新次数加1;S42:判断更新次数是否达到同步阀值,如果是,将流量与数据库中的相应路由器的流量累加,更新到数据库,如果否,返回执行步骤S41;S43:将信号强度、网络模式、GPS位置、最后活跃时间更新到数据库;S44:清空内存节点流量统计,更新次数归零,更新结束。本发明还提供了一种实现上述方法的系统,包括:哈希表创建模块:用于在与路由器连接的服务器内存中创建哈希表;哈希表位置计算模块:用于收到路由器运行数据上报指令,通过哈希函数计算得到所述路由器在服务器内存中对应的节点的哈希表位置;数据更新模块:用于在所述哈希表位置查找是否存在所述路由器的节点信息,如果存在,更新该节点信息;如果不存在,新增节点和节点对应的哈希表索引,并将上报的运行数据存储在新增的节点上;数据库写入模块:用于将内存数据写入数据库。本发明作进一步改进,在数据更新模块在收到路由器运行数据上报指令后,开始更新数据,所述数据更新模块包括:初始化单元:用于开始处理上报数据;第一判断单元:用于判断路由器的参数是否合法,如果是,根据路由器的标示符得到id,如果否,上报处理结束;获取单元:用于获取哈希表位置,在哈希表位置的链表循环查找id;第二判断单元:用于判断是否找到id,如果是,更新路由器运行数据,如果否,新增节点,将运行数据给新增节点赋值,加入链表尾端;结束单元:用于结束上报数据处理。与现有技术相比,本发明的有益效果是:能极大提高并发写入性能,相比传统数据库,本发明能够提高约1000倍写入性能,每秒对外提供数百万次级别更新能力,足够满足百万级大型系统接入应用;本发明基于哈希表,对路由器的标示符进行哈希算法,将运行数据保存在内存,提供每秒百万次级别的更新能力,解决百万级路由器接入的数据上报处理问题;所有路由器数据为链表数组,对每个链表的首地址进行哈希,定位到链表首地址后,再通过循环对比id号来得到具体节点地址,有效解决了哈希冲突。附图说明图1为本发明方法流程图;图2为本发明内存数据结构图;图3为本发明服务器内存更新数据方法流程图;图4为读取内存数据方法流程图;图5为将内存数据写入数据库方法流程图;图6为内存数据与数据库数据同步示意图。具体实施方式下面结合附图和实施例对本发明做进一步详细说明。路由器在运行过程中,需要频繁上报的内容包括:(1)流量使用:差量上报,是指路由器在运行过程中,使用的网络流量,包括上行与下行流量。一般情况下,不包括wifi流量,只包括3G/4G等可能产生费用的网络流量;(2)信号强度:指当前3G/4G网络信号强度;(3)网络模式:指路由器当前工作的网络模式,大部分情况下网络模式是固定的,但在信号不好的时候,路由器可能会从4G切换到3G,或者反过来,在有4G信号的地方,自动从3G切换到4G,此时会发生网络模式变化;(4)告警内容:路由器运行过程中产生的故障会上报;(5)位置信息:GPS位置上报;(6)基站信息:当前连接的基站信息上报;(7)WifiAP上报:路由器作为wifi客户端连接时,上报wifi服务端的AP地址;此外,还可能包括其他信息,比如,在交通,物流运输等项目中,gps位置也会被频繁上报。其中,只要路由器在正常使用、流量使用、信号强度、网络模式数据会频繁上报,如果为了保证监控的时效性,一般路由器上报的时间间隔在10–120秒。对于数百万台设备接入,平均每秒收到的数据上报指令最大约数十万条。本发明就是用于解决海量(百万台级别)路由器同时接入到M2M云平台时,路由器运行状态的更新问题。如图1所示,本发明基于哈希表的路由器运行数据缓存方法包括如下步骤:S1:在与路由器连接的服务器内存中创建哈希表;S2:收到路由器运行数据上报指令,通过哈希函数计算得到所述路由器在服务器内存中对应的节点的哈希表位置;S3:在所述哈希表位置查找是否存在所述路由器的节点信息,如果存在,更新该节点信息;如果不存在,新增节点和节点对应的哈希表索引,并将上报的运行数据存储在新增的节点上;S4:将内存数据写入数据库。服务器系统在启动的时候,内存中节点是空的,哈希表也是空的,在收到路由器运行数据上报指令时,先通过哈希函数计算查找节点位置,因为是第一次上报,肯定是找不到所述路由器的节点信息,因此,需要新增节点,并增加哈希表索引。当同一台设备,第二次上报运行数据的时候,就能够根据哈希表和哈希函数找到该路由器对应的节点了,直接更新该节点运行数据即可。如图2所示,本发明将每个路由器设备的数据视作一个内存节点,这个节点包含路由器流量累积,当前信号强度,网络模式,最后活跃时间,经纬度位置等信息,也可继续扩展添加其它需要频繁上报的字段。内存更新速度数万到数十万倍于数据库系统,可以极大提高性能。此外,本发明基于哈希表,对路由器的标示符进行哈希算法,将运行数据保存在内存,提供每秒百万次级别的更新能力,解决百万级路由器接入的数据上报处理问题,能极大提高服务器的并发写入性能。将路由器信息内存化后,产生的一个问题是,当上报数据指令到达时,如何快速找到对应路由器信息节点位置,本发明中,使用哈希表来索引每个设备的节点位置信息。在步骤S2中,创建索引的方法为:创建一个容量为N的数组指针,所述指针指向一个数组,该数组是由N个节点的首地址组成。其中,数组指针的容量N根据路由器的数量配置。本例系统初始化一个容量N为100000的数组指针,每个指针指向一个vector数组(包括十万个节点的首地址)。对于哈希表,哈希函数是否设计合理,是影响效率的很大因素。哈希函数的设计,由根据路由器序列号的标示符编码规则来决定。每台无线路由器,具有一个唯一标示符,本文中称为SN,SN由两部分组成,前半部分为用户可自定义字符串,提供给客户用于标记区分路由器。后8个字节为路由器唯一序列号。路由器8个字节唯一标示符编码规则如下:第一字节:出厂年,6=2016年,7=2017年,A=2020年,类推;第二字节:出厂月,1=1月,12=12月,类推;第三、第四字节:共同表示生产日期,03=3日,24=24日,类推;第五、六字节:型号计数位;第七、八字节:计数位;除第一个字节外,后面字节取值范围均为0-9,A-F。针对上述编码规则,哈希函数算法如下:A1:对路由器标示符的后8个字节中,每两个字节按照按十六进制文本转二进制,转为一个字节,得到4个字节的二进制数值;A2:将步骤A1得到的二进制数值强制赋值给unsignedint,得到路由器唯一id号;A3:将步骤A2得到的id号对哈希表容量取余,即得到哈希表位置值。当两个路由器的序列号,通过上述hash(哈希)函数,得到的位置相同时,产生hash冲突,本发明中通过链表解决冲突。在步骤A3中,每个哈希表位置采用链表保存数据,当得到哈希表位置后,对链表中每个节点的id号进行对比,如果与请求上报指令的路由器的id号相同,则找到该路由器的节点,否则,在链表尾端新增节点。如图3所示,服务器收到路由器运行数据上报指令,更新数据的具体方法为:S301:开始处理上报数据;S302:判断路由器的参数是否合法,如果是,根据路由器的标示符得到id,如果否,执行步骤S35;S303:获取哈希表位置,在哈希表位置的链表循环查找id;S304:判断是否找到id,如果是,更新路由器运行数据,如果否,新增节点,将运行数据给新增节点赋值,加入链表尾端;S305:上报处理结束。本发明采用C/C++语言举例说明,但并不限定只能由C/C++实现。本发明写入上报数据的函数为:voidreport(constchar*sn,unsignedintflux,charsignal,charnet_mode,doublelat,doublelon);参数说明:sn——路由器序列号,最后8个字节为唯一标示符;flux——上报的流量,差量上报,即每次上报的流量为两次上报间隔内使用的值;signal——网络信号强度;net_mode——网络模式;lat,lon——当前GPS位置经纬度。此外,本发明提供对外读取接口,该接口返回某个设备上报的累积数据,包括流量累积,当前信号强度,网络模式,最后活跃时间等字段。读取接口用于展示数据给用户,或者用于给其它第三方接口调用等提供数据来源。如图4所示,读取内存中路由器运行数据的方法包括如下步骤:S311:开始读取数据;S312:根据路由器的标示符的到id;S313:获取哈希表位置,在哈希表位置的链表循环查找id;S314:判断是否找到id,如果是,读取路由器运行数据,如果否,读取失败;S315:读取结束。读取接口为:voidread(constchar*sn,unsignedint&flux,char&signal,char&net_mode,unsignedint&last_time,double&lat,double&lon);参数说明:sn——路由器序列号,最后8个字节为唯一标示符;flux——输出参数,上报的流量累积;signal——输出参数,网络信号强度;net_mode——输出参数,网络模式;last_time——输出参数,最后活跃时间,unix时间戳;lat,lon——输出参数,读取设备上报的最新gps位置经纬度。虽然,内存数据具有写入快的优点,但在系统重启,断电等特殊场合,可能会导致数据丢失,因此需要定期将内存数据同步写入数据库,以保证数据完整性。如图5所示,本例将内存数据定期写入数据库的具体实现方法为:S41:更新开始,内存每更新一次数据,更新次数加1;S42:判断更新次数是否达到同步阀值,如果是,将流量与数据库中的相应路由器的流量累加,更新到数据库,如果否,返回执行步骤S41;S43:将信号强度、网络模式、GPS位置、最后活跃时间更新到数据库;S44:清空内存节点流量统计,更新次数归零,更新结束。在更新次数达到预设的同步阈值时,例如可以设定为每上报100次数据同步到数据库,锁定节点,将该内存节点数据写入数据库,并清零重设节点更新次数,避免反复同步到数据库。数据库同步接口为:voidsync_to_db(constchar*sn);其中,sn为需要同步写入数据库的节点路由器序列号。如图6所示,为本发明加入数据同步功能后的示意图,同步机制使得即使发生系统断电等极端情况,丢失的数据也在可接受范围内。一台无线通信路由器,每月上报数万到数十万次,在断电等极端场合下丢失小部分数据,对整体统计影响基本可忽略不计。此外,本发明还提供了一种实现上述方法的系统,包括:哈希表创建模块:用于在与路由器连接的服务器内存中创建哈希表;哈希表位置计算模块:用于收到路由器运行数据上报指令,通过哈希函数计算得到所述路由器在服务器内存中对应的节点的哈希表位置;数据更新模块:用于在所述哈希表位置查找是否存在所述路由器的节点信息,如果存在,更新该节点信息;如果不存在,新增节点和节点对应的哈希表索引,并将上报的运行数据存储在新增的节点上;数据库写入模块:用于将内存数据写入数据库。本发明作进一步改进,在数据更新模块在收到路由器运行数据上报指令后,开始更新数据,所述数据更新模块包括:初始化单元:用于开始处理上报数据;第一判断单元:用于判断路由器的参数是否合法,如果是,根据路由器的标示符得到id,如果否,上报处理结束;获取单元:用于获取哈希表位置,在哈希表位置的链表循环查找id;第二判断单元:用于判断是否找到id,如果是,更新路由器运行数据,如果否,新增节点,将运行数据给新增节点赋值,加入链表尾端;结束单元:用于结束上报数据处理。最后,本发明通过与现有数据库系统对比测试来进一步说明。本发明与现有数据库的测试配置如下:项目配置CPUIntelCorei7-3770@3.4GHZ,4核8线程内存8G硬盘1TB企业级硬盘,7200转,64MB缓存操作系统64位Linux,2.6.32内核(VMware虚拟机)数据库Mysql5.1版本通过测试,测试结论如下:通过上述测试结论可以看出,本发明相比传统数据库,可提高约1000倍写入性能,每秒对外提供数百万次级别更新能力,足够满足百万级大型系统接入应用,理想情况下,可满足千万级设备接入需求。以上所述之具体实施方式为本发明的较佳实施方式,并非以此限定本发明的具体实施范围,本发明的范围包括并不限于本具体实施方式,凡依照本发明所作的等效变化均在本发明的保护范围内。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1