著录项信息
专利名称 | 具有容量动态控制功能的内存数据存储装置及其实现方法 |
申请号 | CN200710063612.5 | 申请日期 | 2007-02-06 |
法律状态 | 权利终止 | 申报国家 | 中国 |
公开/公告日 | 2008-08-13 | 公开/公告号 | CN101241492 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F17/30 | IPC分类号 | G;0;6;F;1;7;/;3;0;;;G;0;6;F;1;1;/;0;0;;;G;0;6;F;1;2;/;0;0查看分类表>
|
申请人 | 中兴通讯股份有限公司 | 申请人地址 | 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦法律部
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 中兴通讯股份有限公司 | 当前权利人 | 中兴通讯股份有限公司 |
发明人 | 陶长标 |
代理机构 | 暂无 | 代理人 | 暂无 |
摘要
本发明公开了一种具有容量动态控制功能的内存数据存储装置及其实现方法,该方法包括:步骤一,设置包含纵向链和横向链的二维表表示内存表,纵向链为各CQ队列的记录链,横向链为脏记录链,纵向链、横向链相交的节点是内存表的所有记录,包括脏记录、当前冲突队列记录和空闲队列记录,空闲队列记录存放在FQ队列,且FQ队列的首尾指针登记在内存表的表节点中;脏记录、当前冲突队列记录和空闲队列记录对应的记录数据保存在记录数据区链表中,该记录数据区链表的首地址登记在内存表的表节点中;及步骤二,通过相应的操作接口对内存表的容量进行相应的动态监控与调整。采用本发明大大提高了内存表的使用效率,从而大幅度提高系统处理数据的效率。
1.一种具有容量动态控制功能的内存数据存储装置,其特征在于,包括:数据存储模块、容量监控模块;所述数据存储模块又包括:当前队列CQ记录模块、脏队列DQ记录模块、空闲队列FQ记录模块、记录数据模块及节点信息模块;
所述CQ记录模块,用于通过各CQ队列的记录链分别存放同一哈希值的记录,并连接到哈希索引数据区链表上,且所述各记录链的链头连接在哈希入口链表上;
所述DQ记录模块,用于通过脏记录链存放脏记录,并将接入所述脏记录链的记录连接到所述哈希索引数据区链表上;所述接入所述脏记录链的记录属于DQ队列节点,未接入所述脏记录链的记录属于当前记录队列节点,所述脏记录链中的脏记录按使用先后插入;
所述各CQ队列的记录链与所述脏记录链相交的节点为脏记录、当前冲突队列记录和空闲队列记录;
所述FQ记录模块用于存放所述空闲队列记录;
所述记录数据模块,连接所述CQ记录模块、所述DQ记录模块、所述FQ记录模块,用于通过记录数据区链表保存所述脏记录、所述当前冲突队列记录及所述空闲队列记录对应的记录数据;
所述节点信息模块,连接所述CQ记录模块、所述DQ记录模块、所述FQ记录模块、所述记录数据模块,用于存放所述哈希入口链表的表头信息、所述DQ队列的首尾指针信息、所述FQ的首尾指针信息及所述记录数据区链表的首地址信息;
所述容量监控模块通过不同的操作接口对所述数据存储模块进行相应的动态监控与调整。
2.根据权利要求1所述的具有容量动态控制功能的内存数据存储装置,其特征在于,所述操作接口包括初始化接口、增加记录接口、查询记录接口、修改记录接口、删除记录接口、迁移记录接口、动态控制接口和/或批量清理接口。
3.一种具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,包括: 步骤一,设置包含纵向链和横向链的二维表表示内存表,所述纵向链为各CQ队列的记录链,一条所述记录链存放同一哈希值的记录,并连接到哈希索引数据区链表上,所述记录链的链头连接在哈希入口链表上,所述哈希入口链表的表头登记在所述内存表的表节点中;
所述横向链为脏记录链,接入所述脏记录链的记录属于DQ队列节点,并连接到所述哈希索引数据区链表上,未接入所述脏记录链的记录属于当前记录队列节点,所述脏记录链中的记录按使用先后插入,所述DQ队列的首尾指针登记在所述内存表的表节点中;
所述纵向链、横向链相交的节点是所述内存表的所有记录,包括脏记录、当前冲突队列记录和空闲队列记录,所述空闲队列记录存放在所述FQ队列,且所述FQ队列的首尾指针登记在所述内存表的表节点中;所述脏记录、所述当前冲突队列记录和所述空闲队列记录对应的记录数据保存在记录数据区链表中,该记录数据区链表的首地址登记在所述内存表的表节点中;及
步骤二,通过相应的操作接口对所述内存表的容量进行相应的动态监控与调整。
4.根据权利要求3所述的具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,所述内存表的表节点的结构具体包括:表名、表总容量、哈希模值、每条记录的大小、哈希入口链表的入口指针、哈希索引数据区链表的指针、记录数据区的指针、FQ队列的队首和队尾、DQ队列的队首和队尾、DQ队列的记录数、CQ队列的记录数;其中,所述哈希索引数据区链表的指针又包括:CQ队列的下指针、DQ队列的前向指针、DQ队列的后向指针。
5.根据权利要求3或4所述的具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,所述步骤二中,还包括:通过初始化接口对所述内存表进行初始化的步骤,具体为:根据所述内存表的参数申请内存,并对相应的成员进行初始化,初始化后所述二维表中的所有节点都属于所述FQ队列节点。
6.根据权利要求4所述的具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,所述步骤二中,还包括:通过增加记录接口在所述内存表中增加记录的步骤,具体为:监测所述内存表当前的使用率并根据该使用 率判断所述内存表当前是否达到使用上限;若未达到使用上限,则直接将该记录插入到内存数据库,并挂在所述纵向链中;若已达到使用上限,则启动清理线程,对所述DQ队列中的记录进行清理,释放空间。
7.根据权利要求3或4所述的具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,所述步骤二中,还包括:通过查询记录接口在所述内存表中查询记录的步骤,具体为:根据该记录的主键生成的哈希索引值找到相应的CQ队列的入口,读取相应的记录值。
8.根据权利要求3或4所述的具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,所述步骤二中,还包括:通过修改记录接口在所述内存表中修改记录的步骤,具体为:根据该记录的主键生成的哈希索引值找到相应的CQ队列的入口,读取相应的记录值,并用该记录值更新旧值,若该记录在所述DQ队列中,则将该记录移到所述CQ队列。
9.根据权利要求3或4所述的具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,所述步骤二中,还包括:通过删除记录接口在所述内存表中删除记录的步骤,具体为:根据该记录的主键生成的哈希索引值找到相应的CQ队列的入口,读取相应的记录值;发送消息给物理数据库同步线程,由该物理数据库同步线程将该消息同步入物理数据库,再将该消息从内存中删除。
10.根据权利要求3或4所述的具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,所述步骤二中,还包括:通过迁移记录接口在所述内存表中迁移记录的步骤,具体为:根据该记录的主键生成的哈希索引值找到相应的CQ队列的入口,读取相应的记录值;若该记录已在所述DQ队列中,则不处理,若该记录不在所述DQ队列中,则将该记录从所述CQ队列迁移到所述DQ队列。
11.根据权利要求4所述的具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,所述步骤二中,还包括:通过动态控制接口对所述内存表中的记录进行动态控制的步骤,具体为:当有记录插入时,实时统计出所述内存表当前的使用率;并根据该使用率判断所述内存表当前是否达到已用上限或可用下限,若达到已用上限时,启动清理线程进行数据清理,释放空间;若达到可用下限时,停止清理。
12.根据权利要求3或4所述的具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,所述步骤二中,还包括:通过批量清理接口对所述内存表中的记录进行批量清理的步骤,具体为:从所述DQ队列首开始,一次批量读取多条记录;发送消息给物理数据库同步线程,由所述物理数据库同步线程将该消息同步入所述物理数据库,再将记录从所述内存表中删除。
13.根据权利要求6或11所述的具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,所述使用率为所述CQ队列的记录总数与所述DQ队列的记录总数之和与所述内存表的总记录数的比值。
具有容量动态控制功能的内存数据存储装置及其实现方法\n技术领域\n[0001] 本发明涉及一种具有容量动态控制功能的内存数据存储装置及其实现方法,特别是涉及一种在应用系统运行过程中根据内存数据库的使用情况对内存数据库容量进行动态调整以达到内存数据库持续可用的实现方法及其装置。\n背景技术\n[0002] 随着丰富多彩的各种移动增殖业务(如点对点短信业务、多媒体彩信业务等)的开展及普及,业务量每年都在快速增长,为了提高系统的数据处理能力,系统一般都采用内存数据库。因为内存数据库与物理数据库相比,有着无法比拟的处理速度,所以内存数据库正被越来越多的业务系统所采用。\n[0003] 在目前的内存数据库系统中,一般都是采用一个哈希(Hash)冲突队列来保存记录,一条记录在内存数据库中的生存周期是由业务层来决定的,而不是内存数据库主动控制,对内存数据库中的记录的清理都是采用一个独立线程扫描死记录(即生命周期超长的记录)的方式进行,而对内存数据库容量缺少一种实时的监控与管理,很容易造成内存数据库的溢出(即使用率达100%),使内存表无效。\n[0004] 同时,又因为记录在内存数据库的生存周期是由业务层决定,所以就会存在一旦业务层控制不好,一条记录就会反复在内存数据库与物理数据库之间反复操作,这就增加不必要的物理I/O(Input/Output,输入/输出)操作,严重制约着整个系统的处理性能。\n发明内容\n[0005] 本发明所要解决的技术问题在于提供一种具有容量动态控制功能的内存数据存储装置及其实现方法,用于通过最大可能地利用内存数据库操作速度高于物理库的特点,来提高系统的数据处理性能,并保证内存数据库的稳定可用性与健壮性。\n[0006] 为了实现上述目的,本发明提供了一种具有容量动态控制功能的内存数据存储装置,其特征在于,包括:数据存储模块、容量监控模块;所述数据存储模块又包括:CQ记录模块、DQ记录模块、FQ记录模块、记录数据模块及节点信息模块;\n[0007] 所述CQ记录模块,用于通过各CQ队列的记录链分别存放同一哈希值的记录,并连接到哈希索引数据区链表上,且所述各记录链的链头连接在哈希入口链表上;\n[0008] 所述DQ记录模块,用于通过脏记录链存放脏记录,并将接入所述脏记录链的记录连接到所述哈希索引数据区链表上;所述接入所述脏记录链的记录属于DQ队列节点,未接入所述脏记录链的记录属于当前记录队列节点,所述脏记录链中的脏记录按使用先后插入;\n[0009] 所述各CQ队列的记录链与所述脏记录链相交的节点为脏记录、当前冲突队列记录和空闲队列记录;\n[0010] 所述FQ记录模块用于存放所述空闲队列记录;\n[0011] 所述记录数据模块,连接所述CQ记录模块、所述DQ记录模块、所述FQ记录模块,用于通过记录数据区链表保存所述脏记录、所述当前冲突队列记录及所述空闲队列记录对应的记录数据;\n[0012] 所述节点信息模块,连接所述CQ记录模块、所述DQ记录模块、所述FQ记录模块、所述记录数据模块,用于存放所述哈希入口链表的表头信息、所述DQ队列的首尾指针信息、所述FQ的首尾指针信息及所述记录数据区链表的首地址信息;\n[0013] 所述容量监控模块通过不同的操作接口对所述数据存储模块进行相应的动态监控与调整。\n[0014] 所述的具有容量动态控制功能的内存数据存储装置,其中,所述操作接口包括初始化接口、增加记录接口、查询记录接口、修改记录接口、删除记录接口、迁移记录接口、动态控制接口和/或批量清理接口。\n[0015] 为了实现上述目的,本发明还提供了一种具有容量动态控制功能的内存数据存储装置的实现方法,其特征在于,包括:\n[0016] 步骤一,设置包含纵向链和横向链的二维表表示内存表,所述纵向链为各CQ队列的记录链,一条所述记录链存放同一哈希值的记录,并连接到哈希索引数据区链表上,所述记录链的链头连接在哈希入口链表上,所述哈希入口链表的表头登记在所述内存表的表节点中;\n[0017] 所述横向链为脏记录链,接入所述脏记录链的记录属于DQ队列节点,并连接到所述哈希索引数据区链表上,未接入所述脏记录链的记录属于当前记录队列节点,所述脏记录链中的记录按使用先后插入,所述DQ队列的首尾指针登记在所述内存表的表节点中;\n[0018] 所述纵向链、横向链相交的节点是所述内存表的所有记录,包括脏记录、当前冲突队列记录和空闲队列记录,所述空闲队列记录存放在所述FQ队列,且所述FQ队列的首尾指针登记在所述内存表的表节点中;所述脏记录、所述当前冲突队列记录和所述空闲队列记录对应的记录数据保存在记录数据区链表中,该记录数据区链表的首地址登记在所述内存表的表节点中;及\n[0019] 步骤二,通过相应的操作接口对所述内存表的容量进行相应的动态监控与调整。\n[0020] 所述的具有容量动态控制功能的内存数据存储装置的实现方法,其中,所述内存表的表节点的结构具体包括:表名、表总容量、哈希模值、每条记录的大小、哈希入口链表的入口指针、哈希索引数据区链表的指针、记录数据区的指针、FQ队列的队首和队尾、DQ队列的队首和队尾、DQ队列的记录数、CQ队列的记录数;其中,所述哈希索引数据区链表的指针又包括:CQ队列的下指针、DQ队列的前向指针、DQ队列的后向指针。\n[0021] 所述的具有容量动态控制功能的内存数据存储装置的实现方法,其中,所述步骤二中,还包括:通过初始化接口对所述内存表进行初始化的步骤,具体为:根据所述内存表的参数申请内存,并对相应的成员进行初始化,初始化后所述二维表中的所有节点都属于所述FQ队列节点。\n[0022] 所述的具有容量动态控制功能的内存数据存储装置的实现方法,其中,所述步骤二中,还包括:通过增加记录接口在所述内存表中增加记录的步骤,具体为:监测所述内存表当前的使用率并根据该使用率判断所述内存表当前是否达到使用上限;若未达到使用上限,则直接将该记录插入到内存数据库,并挂在所述纵向链中;若已达到使用上限,则启动清理线程,对所述DQ队列中的记录进行清理,释放空间。\n[0023] 所述的具有容量动态控制功能的内存数据存储装置的实现方法,其中,所述步骤二中,还包括:通过查询记录接口在所述内存表中查询记录的步骤,具体为:根据该记录的主键生成的哈希索引值找到相应的CQ队列的入口,读取相应的记录值。\n[0024] 所述的具有容量动态控制功能的内存数据存储装置的实现方法,其中,所述步骤二中,还包括:通过修改记录接口在所述内存表中修改记录的步骤,具体为:根据该记录的主键生成的哈希索引值找到相应的CQ队列的入口,读取相应的记录值,并用该记录值更新旧值,若该记录在所述DQ队列中,则将该记录移到所述CQ队列。\n[0025] 所述的具有容量动态控制功能的内存数据存储装置的实现方法,其中,所述步骤二中,还包括:通过删除记录接口在所述内存表中删除记录的步骤,具体为:根据该记录的主键生成的哈希索引值找到相应的CQ队列的入口,读取相应的记录值;发送消息给物理数据库同步线程,由该物理数据库同步线程将该消息同步入物理数据库,再将该消息从内存中删除。\n[0026] 所述的具有容量动态控制功能的内存数据存储装置的实现方法,其中,所述步骤二中,还包括:通过迁移记录接口在所述内存表中迁移记录的步骤,具体为:根据该记录的主键生成的哈希索引值找到相应的CQ队列的入口,读取相应的记录值;若该记录已在所述DQ队列中,则不处理,若该记录不在所述DQ队列中,则将该记录从所述CQ队列迁移到所述DQ队列。\n[0027] 所述的具有容量动态控制功能的内存数据存储装置的实现方法,其中,所述步骤二中,还包括:通过动态控制接口对所述内存表中的记录进行动态控制的步骤,具体为:当有记录插入时,实时统计出所述内存表当前的使用率;并根据该使用率判断所述内存表当前是否达到已用上限或可用下限,若达到已用上限时,启动清理线程进行数据清理,释放空间;若达到可用下限时,停止清理。\n[0028] 所述的具有容量动态控制功能的内存数据存储装置的实现方法,其中,所述步骤二中,还包括:通过批量清理接口对所述内存表中的记录进行批量清理的步骤,具体为:从所述DQ队列首开始,一次批量读取多条记录;发送消息给物理数据库同步线程,由所述物理数据库同步线程将该消息同步入所述物理数据库,再将记录从所述内存表中删除。\n[0029] 所述的具有容量动态控制功能的内存数据存储装置的实现方法,其中,所述使用率为所述CQ队列的记录总数与所述DQ队列的记录总数之和与所述内存表的总记录数的比值。\n[0030] 本发明的有益技术效果:\n[0031] 与现有技术的内存数据库相比,采用本发明可以尽可能充分利用系统的物理内存来保存业务有效期内的消息记录,对记录的操作尽量在内存中完成,大大提高了内存表的使用效率,减少了不必要的物理I/O操作,能大幅度提高系统处理数据的效率。\n[0032] 以下结合附图和具体实施例对本发明进行详细描述,但不作为对本发明的限定。\n附图说明\n[0033] 图1是本发明内存表结构示例图;\n[0034] 图2是本发明的内存数据存储装置示意图;\n[0035] 图3是本发明内存表初始化流程图;\n[0036] 图4是本发明新增记录流程图;\n[0037] 图5是本发明操作过程中某一时刻的内存表结构示意图;\n[0038] 图6是本发明查询记录流程图;\n[0039] 图7是本发明修改记录流程图;\n[0040] 图8是本发明删除记录流程图;\n[0041] 图9是本发明迁移记录流程图;\n[0042] 图10是本发明容量动态控制流程图;\n[0043] 图11是本发明过期记录清理流程图。\n具体实施方式\n[0044] 下面结合附图对本发明内存数据库容量的控制进行详细描述。\n[0045] 请参阅图1所示,是本发明表示内存表的结构,按记录在内存表内的生存周期角度看,内存表的记录分别保存在三个不同的队列中:\n[0046] 1),CQ(Current Queue,当前队列)队列,为当前哈希冲突队列,用于存放当前正在处理的记录;\n[0047] 2),DQ(Dirty Queue,脏队列)队列,用于存放当前没使用的但业务流程还没有结束,还不能清理出内存的记录;\n[0048] 3),FQ(Free Queue,空闲队列)队列,用于保存未用空间的节点。\n[0049] 内存表的初始结构中有三个链表,分别表示为:\n[0050] A,Hash入口链表101,用Entry登记该链表的首地址,用于存放各记录Hash冲突队列首地址信息。本链表的节点总数为Hash模值(HashModule)。\n[0051] B,Hash索引数据区链表102,用Index登记首地址,用于登记索引的指针信息,包括:CQ队列的后向指针Next、DQ队列的前向与后向指针;CQ队列的后向指针Next指向同一Hash值的下一个CQ队列的记录,CQ队列的首地址登记在Hash入口链表101中;DQ队列的前向与后向指针指向DQ队列的前一条和后一条记录。本链表的记录总数为内存表的总容量值。本链表的节点总数为CQ队列、DQ队列和FQ队列三个队列的记录总和。\n[0052] C,记录数据区链表103,用RecPtr登记首地址,用于存放记录的实际数据。因同一内存表中的各记录大小是一样的,所以可通过首地址和偏移量迅速找到对应的记录值。本链表的记录总数为内存表的总容量值。\n[0053] 其中,CQ队列、DQ队列前二个队列构成了内存表的二维结构:从纵向看,所有的记录都挂接在CQ队列的Hash入口链表101上;从横向看,如果此记录属于脏记录队列节点,则就会连接到DQ队列的Hash索引数据区链表102,用前后向双向指针表明其位置,有利于链表节点的增删操作,如果此记录不属于脏记录队列节点,则为当前记录队列节点,横向指针无链接信息。\n[0054] 在内存表结构中,还有以下地址指针:脏记录队列首尾指针、空闲队列首尾指针,分别用于登记DQ队列和FQ队列的首尾地址。\n[0055] 本发明将内存表由传统的一维表(单条哈希冲突队列)改用二维表(哈希冲突队列和脏记录队列)来表示,二维表的纵向链是各冲突队列的记录链,同一Hash值的记录放在一条链上,链头连接在Hash入口链表101上(Hash入口链表101表头登记内存表表节点在内存表的表节点中);二维表的横向链是脏记录链,是一个双向的链表结构,凡是接入脏记录链的记录都是属于脏记录队列节点,没有接入脏记录链的记录则属于当前记录队列节点,脏记录链中的记录按使用先后插入,DQ队列的首尾指针登记在内存表的表节点中;二维表内纵横链相交的节点就是内存表的所有记录(包括脏记录、当前冲突队列记录和空闲队列记录)。\n[0056] 进一步地,在二维表中只登记相应的链表指针信息,而记录真正的值则是保存在初始化已申请好的记录数据区链表103中,记录数据区链表103的首地址登记在内存表的表节点中,因为同一内存表的各记录大小一样,所以只需要登记好数据区首地址和各记录对应的偏移量,就可取出相应的记录数据,同时因为记录的值统一保存在一个地方,避免了保存在链表中时需要两个拷贝(CQ队列与DQ队列节点)的冗余情况,节省了很大的内存空间。\n[0057] 进一步地,在内存表使用过程中,实时统计出当前的使用率((CQ记录总数+DQ记录总数)/内存表总记录数),如果使用率达到使用上限时,则从二维表的横向链即DQ队列进行批量清理,将DQ队列中的节点清理出内存,释放出相应的节点入FQ队列中。因为DQ队列中的节点是按记录的使用先后进行排序插入的,所以从DQ队列的队首开始清理,从而保证了记录的FIFO(First In First Out,先进先出)原则,确保内存表中记录的新鲜性和可用性,达到提高内存表利用率和减少物理数据库I/O的目的,从而最终提高系统处理数据的效率。\n[0058] 进一步地,在内存表的表节点的结构中,必须包含以下几个主要的成员:\n[0059] a1),表名:保存本内存表的表名,用于唯一标识内存表;\n[0060] a2),表总容量Vol:根据配置的内存表总记录数乘以一条记录大小得到本内存表所需的最大内存容量;\n[0061] a3),Hash模值:哈希函数的模值;\n[0062] a4),一条记录大小RecSize:以字节为单位;\n[0063] a5),CQ队列的记录数:当前队列的记录数,初始化时为0;\n[0064] a6),Hash入口链表101的入口指针Entry:用本记录的关键字与哈希模经过哈希函数计算后得到的哈希表的入口值;\n[0065] a7),Hash索引数据区链表102的指针Index:记录的Hash索引指针信息,包括:\n纵向与横向的指针信息;\n[0066] a8),记录数据区链表103的指针RecPtr:用于存放记录内容的数据;\n[0067] a9),FQ队列的队首:空闲队列的队首;\n[0068] a10),FQ队列的队尾:空闲队列的队尾;\n[0069] a11),DQ队列的队首:脏记录队列的队首;\n[0070] a12),DQ队列的队尾:脏记录队列的队尾;\n[0071] a13),DQ队列的记录数:脏记录队列的记录数;\n[0072] 其中:Hash索引数据区的指针Index a7)应有以下内容:\n[0073] a71),冲突队列的下指针Next:指向同一个哈希值的冲突队列的下一个节点,用于维系二维表的纵向链。纵向链挂在Hash入口链表101上,Hash入口链表101的首地址登记在内存表的表节点的Entry中;\n[0074] a72),DQ队列的前向指针PreRec:脏记录队列节点的前向指针;\n[0075] a73),DQ队列的后向指针NextRec:脏记录队列节点的后向指针。\n[0076] 其中,PreRec和NextRec用于维系二维表的横向链。横向链的链首尾地址登记在内存表的表节点的DQ队列的队首队尾中。\n[0077] 在此结构下,利用相应的操作接口就可以对内存表的容量进行动态监控与调整。\n相应的操作接口包括:\n[0078] b1),初始化接口:根据内存表的参数申请内存,并对相应的成员进行初始化。此时二维表中的所有节点都属于FQ队列节点。\n[0079] b2),增加记录:在新增记录时,首先监测内存表当前的使用率,在没有达到使用上限时直接将记录插入到内存库中,挂在二维表的纵向链中。如果内存表当前已达到使用上限,则启动清理线程,对DQ队列中的记录进行清理,释放空间。\n[0080] b3),查询记录:根据记录的主键通过相应的Hash函数生成的Hash索引值HashIndex,找到相应的冲突队列的入口,读取相应的记录值。\n[0081] b4),修改记录:根据记录的主键生成的HashIndex,找到相应的冲突队列的入口,读取相应的记录值,用新值来更新旧值,如果此记录在DQ队列中,则将此记录移到CQ队列中,以保证CQ队列的记录最新性。\n[0082] b5),删除记录:根据记录的主键生成的HashIndex,找到相应的冲突队列的入口,读取相应的记录值;发消息给物理库同步线程,将此消息同步入物理库(为保证处理效率,可用异步方式进行同步),保证消息的正确性,再将消息从内存中删除。\n[0083] b6),迁移记录:根据记录的主键生成的HashIndex,找到相应的冲突队列的入口,读取相应的记录值;如果此消息已在DQ队列中,则不处理,如果不在DQ队列中,则将记录从CQ队列中迁移到DQ队列中,以保证记录不积压在CQ队列中,造成内存表溢出。\n[0084] b7),动态控制:每当有新记录插入时,实时统计出内存表的使用率,如果达到已用上限,则启动清理线程进行数据清理,释放空间;当使用率已达到可用下限时,则停止清理。\n[0085] b8),批量清理:从DQ队列首开始,一次批量读取多条记录,先发消息给物理库同步线程,将此消息同步入物理库,后将记录从内存表中删除。\n[0086] 请参阅图2所示,是本发明的内存数据存储装置示意图,结合图1,该装置包括数据存储模块10、容量监控模块20;数据存储模块10又包括:CQ记录模块110、DQ记录模块\n120、FQ记录模块130、记录数据模块140及节点信息模块150;\n[0087] CQ记录模块110,其通过各CQ队列的记录链分别存放同一哈希值的记录,并连接到哈希索引数据区链表上,且各记录链的链头连接在哈希入口链表上;\n[0088] DQ记录模块120,其通过脏记录链存放脏记录,并将接入脏记录链的记录连接到DQ队列的哈希索引数据区链表上;接入所述脏记录链的记录属于DQ队列节点,未接入脏记录链的记录属于当前记录队列节点,脏记录链中的脏记录按使用先后插入;\n[0089] 各CQ队列的记录链与脏记录链相交的节点为脏记录、当前冲突队列记录和空闲队列记录;\n[0090] FQ记录模块130用于存放空闲队列记录;\n[0091] 记录数据模块140,连接CQ记录模块110、DQ记录模块120、FQ记录模块130,其通过记录数据区链表保存脏记录、当前冲突队列记录及空闲队列记录对应的记录数据;\n[0092] 节点信息模块150,连接CQ记录模块110、DQ记录模块120、FQ记录模块130、记录数据模块140,用于存放哈希入口链表的表头信息、DQ队列的首尾指针信息、FQ的首尾指针信息及记录数据区链表的首地址信息;\n[0093] 容量监控模块20通过不同的操作接口对数据存储模块10进行相应的动态监控与调整。\n[0094] 操作接口包括初始化接口、增加记录接口、查询记录接口、修改记录接口、删除记录接口、迁移记录接口、动态控制接口、批量清理接口等接口。\n[0095] 请参阅图3所示,是本发明内存表初始化操作流程,用于为内存表的各队列及节点申请好空间。\n[0096] 步骤301,判断此内存表是否已存在,若存在,则不能再次初始化,错误并退出,否则生成新内存表,执行步骤302;\n[0097] 步骤302,为Hash入口链表101申请空间并初始化好初值;\n[0098] 步骤303,为Hash索引节点申请空间,将内存表的Hash索引数据区初始成一Hash索引数据区链表102(首地址Index),各节点的Next为下一节点的Index值。FQ的首尾指针分别每时指向索引数据区的首尾节点;\n[0099] 步骤304,为记录数据区链表103进行初始化;\n[0100] 步骤305,将索引节点初始化成初值,如记录状态、DQ队列的前后向指针等;以及[0101] 步骤306,将结构中的其他成员,如表空间的总容量、记录大小等进行初始化。\n[0102] 为存储与管理方便,将Hash入口链表101和记录数据区链表103用一静态链表(如数组)实现。\n[0103] 请参阅图4所示,是本发明内存表插入记录操作流程。具体为:\n[0104] 步骤401,判断本内存表是否已存在,若不存在,则返回错误码退出;若存在,执行步骤402;\n[0105] 步骤402,在记录插入内存表前,先要实时统计内存表的使用率,并判断内存表的使用率是否已达到上限,若内存表的使用率没有达到上限时,则执行步骤406,将记录插入内存表中;若内存表的使用率达到上限时,则执行步骤403;\n[0106] 步骤403,累计新记录插入请求次数,并判断请求次数是否达到清理上限,若请求次数未达到清理上限(一定量)时,则执行步骤406;若请求次数达到清理上限时,执行步骤404,启动批量清理功能;\n[0107] 该步骤中,累计新记录插入请求次数的目的是避免频繁的记录清理。\n[0108] 步骤404,当内存表的容量达到使用上限时,则调用清理线程将过期的记录从内存表中清除,释放出一定量空间,以保证内存表的持续可用性;并判断内存表的容量是否已达到可用下限,若不是,则执行步骤406;若是,则执行步骤405;\n[0109] 步骤405,记录清理停止;\n[0110] 步骤406,调用Hash处理函数计算本记录的Hash入口值EntryIndex;\n[0111] 步骤407,根据EntryIndex得到Hash冲突队列的索引值HashIndex,根据索引值HashIndex查询Hash冲突队列表,判断此记录是否已存在,若不存在,则执行步骤408;若存在,错误结束;\n[0112] 步骤408,取出FQ队列的队首记录(即头节点)作为新记录的Hash冲突队列存储节点;\n[0113] 步骤409,将从FQ队列取出的节点Index索引号作为本记录的冲突队列的Hash索引值HashIndex;\n[0114] 步骤410,将本节点的HashIndex填入冲突队列的Hash入口链表101中;\n[0115] 步骤411,登记本记录的操作状态;\n[0116] 步骤412,以HashIndex作为偏移量,将本记录的实际值存入记录数据区链表103中;以及\n[0117] 步骤413,为了保证记录按操作的顺序以FIFO(First Input First Output,先进先出)方式排列在DQ队列中,所以在记录插入成功后,调用记录迁移函数将本记录从CQ队列迁移到DQ队列尾。\n[0118] 请参阅图5所示,是本发明表示内存表在操作过程中的某一时刻各记录存储情况示意图,可以比较清楚展示内存表作为一个二维链表结构控制记录的情况,纵向链表为各记录的冲突队列记录节点,链表头统一放在Hash入口链表101中;横向链表为脏记录队列记录节点,记录按先后顺序插入,脏记录队列的首尾信息保存在内存表结构中,这样很容易根据首地址从队首开始清理过期记录,保证留在内存表中的记录为最新使用过的记录,且确保内存表不会因记录过多而溢出。\n[0119] 如图6所示,是本发明表示查询一条记录的操作过程,因为不管记录是在CQ队列还是在DQ队列中,记录的唯一标识——Hash冲突表的Hash索引值HashIndex都保存在Hash入口链表101中,所以查询时不需要知道记录在那个队列中,只需要根据关键字通过Hash函数计算出对应的Hash索引值HashIndex,根据Hash索引值HashIndex在Hash入口链表101都能找到对应的记录,具体步骤:\n[0120] 步骤601,判断内存表是否可用,若可用,则执行步骤602,若不可用,则错误并退出;\n[0121] 步骤602,根据记录的主键调用Hash函数计算出该记录的Hash入口链表101的入口值EntryIndex;\n[0122] 步骤603,根据入口值EntryIndex从Hash入口链表101中取出对应的Hash索引值HashIndex;\n[0123] 步骤604,根据Hash索引值HashIndex查找对应的冲突队列,并根据主键判断此记录是否存在CQ队列中,如果在CQ队列中找到记录,则执行步骤605;如果在CQ队列中找不到记录,则错误并退出;以及\n[0124] 步骤605,根据记录数据区首地址和本记录的HashIndex偏移量,取出本记录的实际值。\n[0125] 请参阅图7所示,是本发明修改一条记录的操作过程,修改记录时先根据关键字通过Hash函数计算出对应的Hash索引值HashIndex,根据Hash索引值HashIndex在Hash入口链表101中找到对应的记录,再根据Hash索引值HashIndex作为记录值保存的偏移量取出对应的旧值,开始的过程与查询操作一样,具体步骤如下:\n[0126] 步骤701,判断内存表是否可用,若可用,则执行步骤702,若不可用,则错误并退出;\n[0127] 步骤702,根据记录的主键调用Hash函数计算出该记录的Hash入口链表101的入口值EntryIndex;\n[0128] 步骤703,根据入口值EntryIndex从Hash入口链表101中取出对应的Hash索引值HashIndex;\n[0129] 步骤704,根据Hash索引值HashIndex查找对应的冲突队列,并根据主键判断此记录是否存在CQ队列中,如果在CQ队列中找到记录,则执行步骤705;如果在CQ队列中找不到记录,则错误并退出;以及\n[0130] 步骤705,取出记录的旧值后,用新值替换旧值;并判断此记录是否在DQ队列中,如果此记录是在DQ队列中,则执行步骤706,如果此记录不是在DQ队列中,则成功退出;以及\n[0131] 步骤706,为保证CQ队列中的记录最新性,当此记录是在DQ队列中时,将记录从DQ队列中迁移到CQ队列中。\n[0132] 请参阅图8所示,是本发明表示删除一条记录的操作过程,删除记录时先根据关键字通过Hash函数计算出对应的Hash索引值HashIndex,再根据Hash索引值HashIndex在Hash入口链表101中找到对应的记录,具体步骤如下:\n[0133] 步骤801,判断内存表是否可用,若可用,则执行步骤802,若不可用,则错误并退出;\n[0134] 步骤802,根据记录的主键调用Hash函数计算出该记录的Hash入口链表101的入口值EntryIndex;\n[0135] 步骤803,根据入口值EntryIndex从Hash入口链表101中取出对应的Hash索引值HashIndex;\n[0136] 步骤804,根据Hash索引值HashIndex查找对应的冲突队列,并根据主键判断此记录是否存在CQ队列中,如果在CQ队列中找到记录,则执行步骤805;如果在CQ队列中找不到记录,则错误并退出;\n[0137] 步骤805,根据记录的DQ队列的前后向指针及DQ队列的首尾指针,判断此记录是否在DQ队列中,如果此记录在DQ队列中,则执行806,如果此记录不在DQ队列中,则执行\n807;\n[0138] 步骤806,将此记录先从DQ队列中断开,再将此记录从DQ队列移到CQ队列中;\n[0139] 步骤807,将记录从内存表中删除,即将记录从CQ队列中删除;以及[0140] 步骤808,释放出本记录的空间,将本记录节点置空,归还到FQ队列中。\n[0141] 请参阅图9所示,是本发明记录从CQ队列中迁移到DQ队列中的操作过程,迁移的目的是为保证CQ队列只保存最新的记录,而对那些近期可能不再使用到业务流程还没有结束且不能从内存表中删除的记录,需要从CQ队列中迁移到DQ队列中。迁移时先根据关键字通过Hash函数计算出对应的Hash索引值HashIndex,再根据Hash索引值HashIndex在Hash入口链表101找到对应的记录,检查此记录是否在DQ队列中,如果不在,则将此记录插入DQ队列尾。具体步骤如下:\n[0142] 步骤901,判断内存表是否可用,若可用,则执行步骤902,若不可用,则错误并退出;\n[0143] 步骤902,根据记录的主键调用Hash函数计算出该记录的Hash入口链表101的入口值EntryIndex;\n[0144] 步骤903,根据入口值EntryIndex从Hash入口链表101中取出对应的Hash索引值HashIndex;\n[0145] 步骤904,根据Hash索引值HashIndex查找对应的冲突队列,并根据主键判断此记录是否在CQ队列中,如果在CQ队列中找到此记录,则执行步骤905;如果在CQ队列中找不到此记录,则错误并退出;\n[0146] 步骤905,根据记录的DQ队列的前后向指针及DQ的首尾指针,判断此记录是否在DQ队列中;如果记录不在DQ队列中,则执行步骤906;如果记录在DQ队列中,则成功退出;\n以及\n[0147] 步骤906,将记录插入到DQ队列的队尾。\n[0148] 请参阅图10所示,是本发明表示动态控制内存表空间的操作流程。如果使用率达到最高使用上限,则启动清理线程,进行清理。为保证清理的效率,一般采用批量清理的方式。为防止清理线程无限制的清理,当使用率清理到可用下限时,则停止本次清理工作。当使用率达上限时,并不立即启动清理线程立即开始清理,而是先累加清理请求次数,当请求清理次数达到一定量时,则开始启动清理线程清理,原因是如果一有清理请求就开始启动清理线程,那就会发生清理线程不停地被调用,大大消耗系统的资源,使系统陷入近似死循环的僵局。在内存表使用率达到上限时,内存表并不是全部用满,还有一部分空间可用,只要调整好请求清理次数和业务量间的比例,完全可以保证在清理线程启动前内存表有空闲结点给新记录使用。具体为:\n[0149] 步骤1001,判断本内存表是否已存在,若不存在,则返回错误码退出;若存在,执行步骤1002;\n[0150] 步骤1002,在记录插入内存表前,先要实时统计内存表的使用率,并判断内存表的使用率是否已达到上限,若内存表的使用率没有达到上限时,则执行步骤1006,将记录插入内存表中;若内存表的使用率达到上限时,则执行步骤1003;\n[0151] 步骤1003,累计新记录插入请求次数,并判断请求次数是否达到清理上限,若请求次数未达到清理上限(一定量)时,则执行步骤1006;若请求次数达到清理上限时,执行步骤1004,启动批量清理功能;\n[0152] 该步骤中,累计新记录插入请求次数的目的是避免频繁的记录清理。\n[0153] 步骤1004,当内存表的容量达到使用上限时,则调用清理线程将过期的记录从内存表中清除,释放出一定量空间,以保证内存表的持续可用性;并判断内存表的容量是否已达到可用下限,若不是,则执行步骤1006;若是,则执行步骤1005;\n[0154] 步骤1005,记录清理停止;以及\n[0155] 步骤1006,将记录插入内存表中。\n[0156] 上述步骤1001中,在有新记录需要插入时,采用以下公式实时计算出当前内存表的使用率:\n[0157] 使用率=((CQ记录总数+DQ记录总数)/内存表的总容量)*100\n[0158] 上述步骤1003中,为减少清理的频度,采取批量清理的方式,由清理线程进行批量清理。\n[0159] 请参阅图11所示,是本发明表示清理线程批量清理的操作过程,当清理线程收到开始清理的消息后,从DQ队列的首节点开始,循环进行清理过期记录。先从DQ队列中取出相应的Hash索引值HashIndex,根据Hash索引值HashIndex在Hash入口链表101找到对应的记录,先向物理同步进程发送同步消息,将本消息更新入物理数据库,再将本记录从内存表中删除。一次清理的数量可根据业务量动态设置,一般只在保证每次清理出的空闲节点多于请求插入的新记录节点就可,具体步骤如下:\n[0160] 步骤1101,根据参数配置文件中批量清理值判断清理是否结束,如果结束,则成功退出,结束;如果没有结束,则执行步骤1102;\n[0161] 步骤1102,从DQ队列首地址开始取一条记录,因为DQ是双向指针链表,所以很容易对链表进行操作;\n[0162] 步骤1103,取出一条记录后,为保证内存记录与物理库记录的一致性,所以先发消息给物理库同步进程,将本记录放入同步队列中,等待同步入物理库,并转入步骤1106;\n[0163] 步骤1104,将本记录从DQ队列中删除;\n[0164] 步骤1105,把记录归还到空闲队列,并返回至步骤1101;\n[0165] 步骤1106,物理库同步线程收到消息后,将记录放入同步队列中;\n[0166] 步骤1107,等同步时机到来时,将记录同步入物理库中。\n[0167] 同步时机有两个:一是同步队列满,二是定时同步时间到。这样,就保证了记录信息不会丢失。\n[0168] 一般来说,原则上对于含有数据库操作的联机事务处理系统(OnlineTransaction Processing,OLTP)都可使用本发明的内存表来提高数据库操作效率,用本发明的内存表方法能能大大减少物理数据库的物理I/O操作。\n[0169] 本发明通过对内存表的空间进行实时控制和调整,尽可能将最新的有效期内的消息记录操作在内存数据库进行,最大可能地利用内存操作速度高于物理数据库操作的特点,来提高系统的数据处理性能,并保证内存数据库的稳定可用性与健壮性。\n[0170] 当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
法律信息
- 2017-03-29
未缴年费专利权终止
IPC(主分类): G06F 17/30
专利号: ZL 200710063612.5
申请日: 2007.02.06
授权公告日: 2011.05.11
- 2011-05-11
- 2009-08-12
- 2008-08-13
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2006-10-18
|
2005-04-15
| | |
2
| |
2005-07-06
|
2003-12-29
| | |
3
| |
2004-11-10
|
2003-11-17
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |