一种支持历史Key信息的内存数据库的制作方法

文档序号:6340045阅读:335来源:国知局
专利名称:一种支持历史Key信息的内存数据库的制作方法
技术领域
本发明涉及计算机应用领域,尤其涉及内存数据库领域,可用于空中交通管制系 统(ATC)中需要保存历史信息的数据存储。
背景技术
ATC系统中,在集群或双机服务器环境中,雷达数据处理同一飞机目标的多个跟踪 数据。这些目标跟踪数据是在时间流逝中被雷达探测到并被处理的。一般的,同一个目标被 赋以一个唯一的编号(即航迹号)直到飞机目标消失。随着时间的流逝和处理的进行,一个 目标将在一个航迹号下产生连续的多个处理目标点信息。在集群服务器环境中,雷达的数 据处理集中在主态的进程或主机中。当这些主机关闭或进程失效时,集群将发生主备切换, 备份机变为主态机,这时该主机将重新跟踪目标,而航迹号的生成也会和之前不一致,这为 系统的其它处理带来不便。所以通常主态机的航迹历史数据将定时送往备份机,以便发生 主备切换时,系统可以较好的延续已有的航迹号进行处理。如果在运行过程中,集群中其它 主机存有这些目标的中间处理历史数据,其他主机就可以直接提取这些目标的历史中间数 据,直接进行处理,这样就可以解决没有历史数据而导致的跟踪精度不高的问题。采用这种 方法以后,其它主机或进程在备份状态时可以不接收雷达数据并进行相关处理,也不必进 行这些历史数据的同步操作,大大节省CPU资源。memcached (http//memcached. org/)是著名的内存数据库,通过部署在不同主机 上memcached还具有分布式内存数据库的特征。在本发明中为提高访问效率各主机采用了 memcached内存数据库。内存数据库是一种Key-value数据库,它是一种非关系数据库,这 种数据库适合存放对应关系明确、可以用Key值进行检索查询的数据。在一些特殊的应用 中,如集群或双机环境中,雷达数据处理同一目标的多个跟踪数据,这种数据需要在多个主 机间进行存储,即要求对同一 Key有多条数据的存储,但memcahed不支持重复Key的存储, 本发明旨在对memcahed进行改造,加入了支持历史Key值存储的技术,对于雷达数据处理 的应用,Key即为航迹号。

发明内容
本发明的目的是解决以ATC系统为代表的分布式系统中以Key-Value方式对同一 Key值存储的历史数据的访问问题。本发明的基本思路是对memcahed进行改造,改造后的memcahed成为能够支持历 史信息的Hmemcached,支持对历史Key值数据的存储。Key值的数据存储不是覆盖,而是采 用不断追加记录的方式。一个Key的历史数据的数量可以根据具体应用的需要而设定。使 用者在追加时不需考虑数据的历史特征。本发明的目的是这样达到的对memcahed中的某些函数进行改造,改造后的 memcahed成为能够支持历史信息的Hmemcached。对于同一 KEY值不同的历史数据在 Hmemcached内部的存储使用Key_No作为Key值的形式,No是值从0到MAX_RECN0_1中的某个数。当主机中某个进程提出对某个Key写入请求时,启动数据操作流程,由HMemcached通 过查询当前操作的Key的记录条数,若未超过设定的最大记录条数,则直接追加一条记录; 若超过设定的最大记录条数,则采用先进先出的方法,删除掉首条记录,再将新记录追加至 此Key的记录中。系统中的数据以KEY-VALUE的方式存储,memcached客户端实例化为N个,N为集 群中主机的个数。每个客户端连接一个集群环境中的服务器主机,主态进程调用对Key值 进行赋值操作时,调用每个客户端实例对集群中主机的Hmemcached进行写入操作,数据被 写入每个主机的Hmemecached管理的内存中。所述对memcahed进行改造包括增加自定义get_KeyitemList函数,改造 process_update_command 函数、complete_nread 函数、process_get_command 函数禾口 process_delete_command 函数。在自定义get_KeyitemList函数中,获得Key对应的所有历史item,存储到作为返 回值的item_list链表中,确定返回该Key值有多少条记录。在process_update_command加入对更新的Key值的处理,完成新记录数据的加 入。在completejread函数中加入对更新的Key值的处理,完成新记录数据的加入。在process_get_co_and加入读取指定Key所有记录数据的处理。在prOCeSS_delete_COmmand加入读取指定Key所有记录数据并进行删除处理。数据操作流程包括数据写入、数据读出和数据删除。数据操作流程中的数据写入过程是当Hmemcached需要写入数据时,调用改造后 的process_update_command函数,该函数将当前要操作的Key中的所有的历史记录读出到 一个临时item链表tmpitemList中,此链表中的Key_N0的NO是从0到MAX_RECN0_1,其中 Key_N0记录对应的是数据库中Key_N0+l的值。然后,根据当前最大的Key_N0作加一操作, 得到新的 Key_N0,调用 item_alloc 分配一个 new_item。当 tmpitemList 的 size 大于 MAX_ RECNO时,则新的Key_N0为Key_ MAX_RECN0 ;此后调用改造后的complete_nread进行数据 库的更新操作,调用 store_item 存储 new_item。若 tmpitemList 的 size 大于 MAX_RECN0, 则采用先进先出策略,将Key_N0中No的最小值对应的记录删除,调用d0_item_i^place函 数将tmpitemList里的Key_N0对应的item代替数据库中旧的Key_N0对应的item。数据操作流程中的数据读出过程是当Hmemcached需要读取数据时,调用改造后 的process_get_command的函数读出某个Key的数据,将ΚθΥ_0···Ν0_1的所有数据一起读 出,并返回当前Key值下的记录条目。数据操作流程中的数据删除过程是当memcached需要删除某个Key值数据时,调 用改造后的process_delete_command的函数将Κθγ_(>··Ν0-1的所有数据一起删除。系统中的数据以KEY-VALUE的方式存储,使用memcahed内存数据库软件的客户端 无需改造,支持^^ get Add replace delete常规操作。本发明的积极效果是
1、有效解决了以ATC系统为代表的分布式系统中以Key-Value方式对同一 Key值存储 的历史数据的访问问题。在发生主备切换时,系统可以较好的延续已有的数据进行处理,解 决没有历史数据而导致的跟踪精度不高的问题。
2、其它主机或进程在备份状态时可以不接收雷达数据并进行相关处理,也不必进 行这些历史数据的同步操作,大大节省CPU资源。3、Memcached的客户端实现非常多,本发明使用现存的memcached客户端而无需 改动,支持如kt get Add replace delete常规操作,方便、实用。


图1 是 get_KeyitemList 实现流程图。图 2 是改造后的 process_update_command 流程图。图3是改造后的complete_nread流程图。图4是改造后的process_get_command流程图。图 5 是改造后的 process_delete_command 流程图。
具体实施例方式对memcahed内存数据库中的函数进行改造,包括新增自定义get_KeyitemLi st函 数,改造 process_update_command、complete_nread、process_get_command 禾口 process_ delete_command函数。改造后的memcahed数据库成为能够支持历史信息的Hmemcached数 据库,支持对历史Key值数据的存储。Key值的数据存储不是覆盖,而是采用不断追加记录 的方式。一个Key的历史数据的数量可以根据具体应用的需要而设定。使用者在追加时不 需考虑数据的历史特征。使用的过程非常简单,使用者只需从网上下载一个memcached客户端的实现,对 其进行封装memcached客户端实例化为N个,N为集群中主机的个数,每个客户端连接一 个集群环境中的服务器主机。主态进程调用对Key值进行赋值操作时,调用每个实例进行 写入操作,这样数据将被写入每个主机的Hmemecached管理的内存中。主备发生切换时,从 备机升级为主机的Hmemecached内存中已经有相关的历史数据,可以直接读取出来并继续 进行处理。使用memcahed内存数据库软件的客户端无需改造,支持kt get Add replace delete常规操作。对于同一 KEY值不同的数据在Hmemcached内部的存储使用Key_N0作为Key值的 形式,NO是值从0到MAX_RECN0-1中的某个数,当主机中某个进程提出对某个Key写入请 求时,启动数据操作流程,由HMemcached通过查询当前操作的Key的记录条数,若未超过设 定的最大记录条数,则直接追加一条记录;若超过设定的最大记录条数,则采用先进先出的 方法,删除掉首条记录,再将新记录追加至此Key的记录中;
附图给出了对memcahed数据库中的函数进行改造的内容和过程。在自定义getJfeyitemList函数中,获得Key对应的所有item,存储到作为返回值 的item_list链表中,确定返回该Key值有多少条记录。定义的方法是开始后设No=0,生 成Key_No字符串,对Key_No调用do-item-get-notedeleted函数,将读到数据放入item_ list列表,判断是否No > =系统允许的最大记录数MAX_RECN0,否,No=No+l,回到Key_no=0 后,重新生成Key_No字符串,是,处理结束,返回No。在process_update_command加入对更新的Key值的处理,完成新记录数据的加 入。处理的具体方法是在原有代码if语句后加入N=get_KeyitemList,读出Key的所有记
5录放入缓存g_itemlist中,然后判断是否N > =系统允许的最大记录数MAX_RECN0,是,将 新加记录放入g_itemlist中,记录名为Key_d,其中,d=MAX_RECN0,回到原有代码,处理结 束;否,将新加记录放Agjtemlist中,记录名为Key_d,其中,d=N ;回到原有代码,处理结
束ο在completejread函数中加入对更新的Key值的处理,完成新记录数据的加入。 处理的具体方法是在原有代码 STATS_L0CK() ;g_stats. set_cmds++ ;STATS_UNL0CK()之后 加入N=g_itemlist中记录的个数,判断N=系统允许的最大记录数MAX_RECN0 ?否,回原有 代码,是,i=N,调用d0_item_i^place,将g_itemlist中第i条记录替换当前数据库中的第 i-1条记录,判断若i > 1 ?是,回到i=N,否则到原代码。在process_get_command加入读取指定Key所有记录数据的处理。处理的具体方 法是在原有代码 do {while (Key_token- > length! =0)};Key=Key_token > value 之后力口 入N=get_KeyitemList,读出Key的所有记录放入缓存g_itemlist中,取i=0,判断是否i < N 否,回到原有代码,处理结束;是,生成Key_d字符串其中,d为i,获得Key_d记录的 长度,回到原有代码,在Key_token++语句前,然后,重复进行i < N的判断。在prOCeSS_delete_COmmand加入读取指定Key所有记录数据并进行删除处理。处 理的具体方法是在原有代码 Key=tokens [Key_T0KEN]. value ; nKey=tokens [Key_T0KEN]. Ie之后加入N=get_Keyitemlist,读出Key的所有记录放入缓存g_itemlist中,当i=0,判 断i < N,否,回到原有代码,处理结束,是,生成Key_d字符串(d为i),获得Key_d记录的 长度,然后回到原有代码,至函数尾部,并重复进行是否i < N的判断。数据操作流程包括数据写入、数据读出和数据删除。数据操作流程中的数据写入过程是当Hmemcached需要写入数据时,调用改造后 的process_update_command函数,该函数将当前要操作的Key中的所有的历史记录读出到 一个临时item链表tmpitemList中。此链表中的Key_N0的NO是从0到MAX_RECN0_1,其中 Key_N0记录对应的是数据库中Key_N0+l的值。然后,根据当前最大的Key_N0作加一操作, 得到新的 Key_N0,调用 item_alloc 分配一个 new_item ;当 tmpitemList 的 size 大于 MAX_ RECNO时,则新的Key_N0为Key_MAX_RECN0 ;此后调用改造后的complete_nread进行数据 库的更新操作,调用 store_item 存储 new_item ;若 tmpitemList 的 size 大于 MAX_RECN0, 则采用先进先出策略,将Key_N0中No的最小值对应的记录删除,调用d0_item_i^place函 数将tmpitemList里的Key_N0对应的item代替数据库中旧的Key_N0对应的item ;
数据操作流程中的数据读出过程是当Hmemcached需要读取数据时,调用改造后的 process_get_command的函数读出某个Key的数据,将ΚθΥ_0···Ν0_1的所有数据一起读出, 并返回当前Key值下的记录条目。数据操作流程中的数据删除过程是当memcached需要删除某个Key值数据时,调 用改造后的process_delete_command的函数将Κθγ_(>··Ν0-1的所有数据一起删除。
权利要求
1.一种支持历史Key信息的内存数据库,其特征在于对memcahed中的某些函数进行 改造,改造后的memcahed成为能够支持历史信息的Hmemcached ;对于同一 KEY值不同的数据在Hmemcached内部的存储使用Key_N0作为Key值的形 式,NO是值从0到系统最大记录数MAX_RECN0-1中的某个数,当主机中某个进程提出对某个 Key写入请求时,启动数据操作流程,由Hmemcached通过查询当前操作的Key的记录条数, 若未超过设定的最大记录条数,则直接追加一条记录;若超过设定的最大记录条数,则采用 先进先出的方法,删除掉首条记录,再将新记录追加至此Key的记录中;系统中的数据以KEY-VALUE的方式存储,memcached客户端实例化为N个,N为集群中 主机的个数,每个客户端连接一个集群环境中的服务器主机,主态进程调用对Key值进行 赋值操作时,调用每个客户端实例对集群中主机的Hmemecached进行写入操作,数据被写 入每个主机的Hmemecached管理的内存中;所述对memcahed中的某些函数进行改造包括增加自定义getJfeyitemList函数,改 造 process_update_command 函数、complete_nread 函数、process_get_command 函数禾口 process_delete_command 函数;在自定义getJfeyitemList函数中,获得Key对应的所有历史item,存储到作为返回值 的item_list链表中,确定返回该Key值有多少条记录;在process_update_command加入对更新的Key值的处理,完成新记录数据的加入; 在completejread函数中加入对更新的Key值的处理,完成新记录数据的加入; 在process_get_command加入读取指定Key所有记录数据的处理; 在pr0cess_delete_c0mmand加入读取指定Key所有记录数据并进行删除处理; 数据操作流程包括数据写入、数据读出和数据删除。
2.如权利要求1所述的内存数据库,其特征在于所述数据操作流程中的数据写入过 程是当Hmemcached需要写入数据时,调用改造后的process_update_command函数,该函 数将当前要操作的Key中的所有的历史记录读出到一个临时item链表tmpitemList中,此 链表中的Key_N0的NO是从0到MAX_RECN0_1,其中Key_N0记录对应的是数据库中Key_ N0+1的值;然后,根据当前最大的Key_N0作加一操作,得到新的Key_N0,调用item_all0C 分配一个 new_item ;当 tmpitemList 的 size 大于 MAX_RECN0 时,则新的 Key_N0 为 Key_ MAX_RECN0 ;此后调用改造后的completejread进行数据库的更新操作,调用storejtem 存储new_item,若tmpitemList的size大于MAX_RECN0,则采用先进先出策略,将Key_N0 中No的最小值对应的记录删除,调用do_item_replace函数将tmpitemList里的Key_N0 对应的item代替数据库中旧的Key_N0对应的item ;所述数据操作流程中的数据读出过程是当Hmemcached需要读取数据时,调用改造后 的process_get_command的函数读出某个Key的数据,将ΚθΥ_0···Ν0_1的所有数据一起读 出,并返回当前Key值下的记录条目;数据操作流程中的数据删除过程是当memcached需要删除某个Key值数据时,调用改 造后的process_delete_command的函数将Κθυ_(>··Ν0-1的所有数据一起删除。
3.如权利要求1所述的内存数据库,其特征在于系统中的数据以KEY-VALUE的方 式存储,使用memcahed内存数据库软件的客户端无需改造,支持kt get Add replace delete常规操作。
全文摘要
支持历史Key信息的内存数据库涉及计算机应用领。在memcached中添加自定义函数get_KeyitemList,对process_update_command、complete_nread、process_get_command和process_delete_command函数改造后成为支持历史Key值存储的Hmemcached。Key值的数据存储采用不断追加记录的方式。一个Key的历史数据的数量根据需要设定。同一KEY值的不同历史数据在Hmemcached内部的存储使用Key_NO作为Key值的形式,NO是从0到系统允许的最大记录数MAX_RECNO-1中的一个数字。记录时若未超过设定的最大记录条数,直接追加;若超过则采用先进先出的方法,删除掉首条记录,再将新记录追加至此Key中。本发明有效解决了分布式系统中以Key-Value方式对同一Key值存储的历史数据访问问题,数据被写入每个主机的Hmemecached管理的内存中,客户端无需改动,方便实用。
文档编号G06F17/30GK102073690SQ20101060711
公开日2011年5月25日 申请日期2010年12月27日 优先权日2010年12月16日
发明者刘宇, 刘舒, 李晓峰, 胡术, 莫思特, 邱敦国, 黄戈 申请人:四川川大智胜软件股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1