具体实施方式
为更进一步阐述本发明为实现预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对依据本发明的具体实施方式、结构、特征及其功效,详细说明如后。
本发明实施例提供一种数据存取方法及装置,其用于计算装置中实现对一些特定类型的数据结构进行查询、新增、删除、遍历等操作。上述的特定类型的数据结构例如是指状态机,但也可以为其他数据结构。上述的计算装置例如可包括服务器、个人计算机、移动电子终端等。
状态机对应的是一个数据结构,其具有多个状态,而每一个状态的变化都是由于网络收发引起的,而在全异步的服务器模型中,为了实现IO(例如网络连接)复用,映射关系频繁被使用,并且服务器需要感知到状态机的超时。当然,状态机也并不限于仅在服务器中被使用,任意计算机或者其他计算装置中使用。
图1为上述的计算装置的一个实施例的结构框图。如图1所示,计算装置100包括:存储器102、存储控制器104、一个或多个(图中仅示出一个)处理器106、外设接口108以及网络模块110。可以理解,图1所示的结构仅为示意,其并不对计算装置100的结构造成限定。例如,计算装置100还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
存储器102可用于存储软件程序以及模块,如本发明实施例中的计算任务处理方法及装置对应的程序指令/模块,处理器104通过运行存储在存储器102内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的方法。
存储器102可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器102可进一步包括相对于处理器106远程设置的存储器,这些远程存储器可以通过网络连接至计算装置100。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。处理器106以及其他可能的组件对存储器102的访问可在存储控制器104的控制下进行。
外设接口108将各种输入/输入装置耦合至处理器106。处理器106运行存储器102内的各种软件、指令计算装置100执行各种功能以及进行数据处理。在一些实施例中,外设接口108、处理器106以及存储控制器104可以在单个芯片中实现。在其他一些实例中,他们可以分别由独立的芯片实现。
网络模块110用于接收以及发送网络信号。上述网络信号可包括无线信号或者有线信号。在一个实例中,上述网络信号为有线网络信号。此时,网络模块110可包括处理器、随机存储器、转换器、晶体振荡器等元件。
上述的软件程序以及模块包括:操作系统122以及数据存取模块124。其中操作系统122例如可为LINUX,UNIX,WINDOWS,其可包括各种用于管理系统任务(例如存储器管理、存储设备控制、电源管理等)的软件组件和/或驱动,并可与各种硬件或软件组件相互通讯,从而提供其他软件组件的运行环境。数据存取模块124运行在操作系统122的基础上,其具体实现本发明实施例提供的数据存取方法,以下结合实施例对上述方法进行描述。
第一实施例提供一种数据存取方法,请参阅图2,本实施例的方法包括:
步骤201、在存储器中构建哈希桶和链表。
处理器106在存储器102中划出一部分存储空间来构建哈希桶和链表,该哈希桶和链表是基于要存储的对象相互关联的。图3为上述的哈希桶及链表的存储结构示意图。哈希桶301是一个结构化数组,可以采用H[N](N为自然数)来表示,其内每个项目H[i](i为自然数且小于等于N)的成员包括序列号、节点地址以及有效数据,其中序列号是一个无符号的整形数值,节点地址是指链表302中对应的节点的地址,而有效数据是指实际此结构实际承载的数据,例如上述的状态机。链表302中的每个节点的成员包括:序列号以及过期时间。
哈希桶301中的每个项目是与要存储的对象一一对应的,链表302中的每个节点也是与要存储的对象一一对应的,而且哈希桶301与链表302中用于存储同一对象的项目或者节点也是相互关联的。具体地,对应于同一对象,若其在链表302内存储的节点的序列号为i,则根据序列号可直接获取一个索引值k,其在哈希桶301中对应的哈希桶项目即为H[k],由于哈希桶的特性,在访问链表302的节点时,通过序列号可以直接定位至哈希桶301中的项目。此外,在哈希桶301的项目中还存储有节点地址,其直接指向链表302中的一个节点,根据节点地址,也可以直接访问链表302中的节点。由此,哈希桶301与链表302可以实现双向快速定位。
步骤202、接收存储数据的指令并获取要存储的对象;
例如,当计算装置100需要保存新的映射关系,例如用户与网络连接之间的映射关系时,其可以为该用户创建状态机,然后计算装置100可将创建的状态机传递给专门的存储模块进行存储。可以理解,此处的存储模块是指数据存取模块124中用于进行存储的子功能模块。相应地,存储模块接收存储数据的指令,并获取要存储的对象(例如上述的状态机)。
步骤203、新分配一个链表的节点,并在该节点内写入该对象的序列号以及过期时间;
根据获取的存储的对象,为其新分配一个链表302的节点,并在该节点内写入该对象的序列号以及过期时间。链表302中的序列号可以是连续进行分配的。过期时间是指超过该时间后存储的对象过期,其所存储的映射关系也不再生效。
步骤204、将该节点插入到该链表中对应的位置,使该链表中所有节点按照过期时间排序;
按照节点的过期时间大小的顺序,根据该节点的过期时间在各个节点的过期时间大小的顺序中的位置,将该节点插入到链表202中对应的位置,使链表202中所有节点按照过期时间排序。
例如,链表中节点1的过期时间是2秒,节点2的过期时间是3秒,节点3的过期时间是5秒,新分配的节点过期时间是4秒,则应将该节点插入链表中节点2和节点3之间的位置。从而使该链表中所有节点按照过期时间排序。
步骤205、根据该序列号获取一个索引值;
例如,可以直接采用该序列号作为索引值,还可以采用一定的算法根据序列号计算索引值。
在一个实例中,索引值=序列号%SIZE,其中%表示取模操作,而SIZE表示哈希桶301的长度。
步骤206、将该对象以及该节点的地址存储在该哈希桶中下标为该索引值的位置。
将存取数据的指令中获取的存储的对象,以及该新分配的节点的地址存储在哈希桶301中下标为该索引值的位置。这样,根据该索引值便可获取存储的对象。
根据本实施例中的数据存储方法,通过在互相可定位的哈希桶和链表组成的数据结构中,在链表中存储节点以及节点对应的数据,并根据存储位置生成索引值,以在哈希桶中快速定位需要处理的对象,用以实现高效的添加、查找、删除操作。并且,可以快速查找到过期的节点,提高处理过期节点的效率。
本发明第二实施例提供一种数据存取方法,请参阅图4,上述方法包括:
步骤401、接收查找数据的指令并获取查找对象的序列号;
上述第一实施例中的哈希桶301和链表302构成的数据结构中,哈希桶301和链表302是基于要存储的对象相互关联的,哈希桶301是一个结构化数组,其内每个项目的成员包括序列号、节点地址以及有效数据,节点序列号是按照预置规则为节点配置的序列号,节点地址是指链表302中对应的节点的地址,而有效数据是指实际此结构实际承载的数据。链表302中的每个节点的成员包括:序列号以及过期时间。哈希桶301中的每个项目是与要存储的对象一一对应的,链表302中的每个节点也是与要存储的对象一一对应的,而且哈希桶301与链表302中用于存储同一对象的项目或者节点也是相互关联的。由于哈希桶的特性,在访问链表302的节点时,通过序列号可以直接定位至哈希桶301中的项目。此外,在哈希桶301的项目中还存储有节点地址,其直接指向链表302中的一个节点,根据节点地址,也可以直接访问链表302中的节点。由此,哈希桶301与链表302可以实现双向快速定位。因此,通过上述数据结构可实现快速查找功能。
具体地,接收查找数据的指令,并根据该指令获取查找对象的序列号。例如,获取的查找对象是节点3,其序列号是3。
步骤402、根据该查找对象的序列号获取该查找对象在该哈希桶内的索引值;
例如,可以直接采用该序列号作为索引值,还可以采用一定的算法根据序列号计算索引值。
在一个实例中,索引值=序列号%SIZE,其中%表示取模操作,而SIZE表示哈希桶301的长度。具体地,根据查找对象节点3的序列号3,哈希桶SIZE是20,则对该哈希桶进行SIZE取模,获取该节点在该哈希桶内的索引值3。
步骤403、若该哈希桶中与该查找对象的索引值对应的位置不为空,则返回该哈希桶中与该目标对象的索引值对应的记录。
例如,若与该查找对象的索引值3对应的哈希桶301的位置不为空,则返回哈希桶301中与该目标对象的索引值对应的记录,该记录可以是与节点3对应的有效数据。本实施例中的查找对象的方法是O(1)的,O(1)是指可以在常数步内可以完成。
根据本实施例中的数据存储方法,通过在互相可定位的哈希桶和链表组成的数据结构中,在链表中存储节点以及节点对应的数据,并通过根据存储位置生成的索引值,在该哈希桶中与该查找对象的索引值对应的位置的记录,以实现在哈希桶中快速定位需要处理的对象,提高处理速度。
本发明第三实施例提供一种数据存取方法,请参阅图5,上述方法包括:
步骤501、接收删除数据的指令并获取删除对象的序列号;
上述第一实施例中的哈希桶301和链表302构成的数据结构中,上述第一实施例中的哈希桶301和链表302构成的数据结构中,哈希桶301和链表302是基于要存储的对象相互关联的,哈希桶301是一个结构化数组,其内每个项目的成员包括序列号、节点地址以及有效数据,节点序列号是按照预置规则为节点配置的序列号,节点地址是指链表302中对应的节点的地址,而有效数据是指实际此结构实际承载的数据。链表302中的每个节点的成员包括:序列号以及过期时间。哈希桶301中的每个项目是与要存储的对象一一对应的,链表302中的每个节点也是与要存储的对象一一对应的,而且哈希桶301与链表302中用于存储同一对象的项目或者节点也是相互关联的。由于哈希桶的特性,在访问链表302的节点时,通过序列号可以直接定位至哈希桶301中的项目。此外,在哈希桶301的项目中还存储有节点地址,其直接指向链表302中的一个节点,根据节点地址,也可以直接访问链表302中的节点。由此,哈希桶301与链表302可以实现双向快速定位。
因此,通过上述数据结构可实现快速删除功能。
具体地,接收删除数据的指令,并根据该删除指令获取删除对象的序列号。例如,获取的删除对象是节点6,其序列号是6。
步骤502、根据该删除对象的序列号获取该删除对象在该哈希桶内的索引值;
例如,可以直接采用该序列号作为索引值,还可以采用一定的算法根据序列号计算索引值。
在一个实例中,索引值=序列号%SIZE,其中%表示取模操作,而SIZE表示哈希桶301的长度。具体地,根据删除对象节点6的序列号6,哈希桶SIZE是20,对该哈希桶进行SIZE取模,获取节点6在该哈希桶内的索引值6。
步骤503、从该哈希桶中与该删除对象的索引值对应的位置获取该链表中与该删除对象对应的节点的地址;
例如,从该哈希桶中与该删除对象节点6的索引值6对应的位置获取该链表中与该删除对象节点6中对应的节点的地址。
步骤504、根据该链表中与该删除对象对应的节点的地址删除对应的节点;
根据链表302中与该删除对象对应的节点的地址删除对应的节点,例如,根据该链表中与该删除对象节点6中对应的节点的地址,将该对应的节点删除。
步骤505、将该哈希桶中与该删除对象的索引值对应的位置设置为表示为空的预设值。
将哈希桶201中与该删除对象节点6的索引值对应的位置,设置为表示为空的预设值,表示已经将节点6的数据从哈希桶中删除。本实施例中的删除对象的方法也是O(1)的。
根据本实施例中的数据存储方法,通过在互相可定位的哈希桶和链表组成的数据结构中,在链表中存储节点以及节点对应的数据,并通过根据存储位置生成的索引值,在该哈希桶中与该查找对象的索引值对应的位置的记录,以实现在哈希桶中快速定位并删除需要处理的对象,提高删除指令的处理速度。
本发明第四实施例提供一种数据存取方法,请参阅图6,上述方法包括:
步骤601、接收超时遍历的指令;
上述第一实施例中的哈希桶301和链表302构成的数据结构中,哈希桶301和链表302是基于要存储的对象相互关联的,哈希桶301是一个结构化数组,其内每个项目的成员包括序列号、节点地址以及有效数据,节点序列号是按照预置规则为节点配置的序列号,节点地址是指链表302中对应的节点的地址,而有效数据是指实际此结构实际承载的数据。链表302中的每个节点的成员包括:序列号以及过期时间。哈希桶301中的每个项目是与要存储的对象一一对应的,链表302中的每个节点也是与要存储的对象一一对应的,而且哈希桶301与链表302中用于存储同一对象的项目或者节点也是相互关联的。由于哈希桶的特性,在访问链表302的节点时,通过序列号可以直接定位至哈希桶301中的项目。此外,在哈希桶301的项目中还存储有节点地址,其直接指向链表302中的一个节点,根据节点地址,也可以直接访问链表302中的节点。由此,哈希桶301与链表302可以实现双向快速定位。通过上述数据结构可实现快速遍历全部节点以检测出超时节点的功能。
具体地,接收超时遍历的指令,该指令用于遍历各节点以确定节点是否过期。
步骤602、根据该超时遍历的指令判断当前节点是否已经过期;
根据该超时遍历的指令,判断当前节点是否已经过期。从左到右遍历链表中的每一个节点,对比当前节点中的时间是否小于当前时间,如果小于当前时间,则说明当前节点已经过期。
若该当前节点已经过期则执行步骤603。
步骤603、获取当前节点的序列号;
在链表302中获取当前节点的序列号。
步骤604、根据该当前节点的序列号获取对应的索引值;
例如,可以直接采用该序列号作为索引值,还可以采用一定的算法根据序列号计算索引值。
在一个实例中,索引值=序列号%SIZE,其中%表示取模操作,而SIZE表示哈希桶301的长度。根据该当前节点的序列号获取对应的索引值,例如,根据当前节点7的序列号7,哈希桶SIZE是20,对该哈希桶进行SIZE取模,获取节点7在该哈希桶内的索引值7。
步骤605、将该哈希桶中与该当前节点的索引值对应的位置设置为表示为空的预设值;
将哈希桶301中与该当前节点的索引值对应的位置,设置为表示为空的预设值,表示将此位置的记录删除。
步骤606、从该链表中删除该当前节点。
从链表302中删除该当前节点。
根据本实施例中的数据存储方法,通过在互相可定位的哈希桶和链表组成的数据结构中,在链表中存储节点以及节点对应的数据,并通过根据存储位置生成的索引值,根据该超时遍历的指令,判断当前节点是否已经过期,以实现在哈希桶中快速查找到过期节点,并将其删除,提高遍历超时节点指令的处理速度。
本发明第五实施例提供一种数据存取装置,其可用于图1所示的计算装置中,参阅图7,本实施例的装置包括:构建模块71、第一获取模块72、链表存储模块73、链表排序模块74、索引值获取模块75以及存储模块76。
构建模块71用于在存储器中构建哈希桶和链表;
处理器106在存储器102中划出一部分存储空间来构建哈希桶和链表,该哈希桶和链表是基于要存储的对象相互关联的。图3为上述的哈希桶及链表的存储结构示意图。哈希桶301是一个结构化数组,可以采用H[N](N为自然数)来表示,其内每个项目H[i](i为自然数且小于等于N)的成员包括序列号、节点地址以及有效数据,其中序列号是一个无符号的整形数值,节点地址是指链表302中对应的节点的地址,而有效数据是指实际此结构实际承载的数据,例如上述的状态机。链表302中的每个节点的成员包括:序列号以及过期时间。
哈希桶301中的每个项目是与要存储的对象一一对应的,链表302中的每个节点也是与要存储的对象一一对应的,而且哈希桶301与链表302中用于存储同一对象的项目或者节点也是相互关联的。具体地,对应于同一对象,若其在链表302内存储的节点的序列号为i,则根据序列号可直接获取一个索引值k,其在哈希桶301中对应的哈希桶项目即为H[k],由于哈希桶的特性,在访问链表302的节点时,通过序列号可以直接定位至哈希桶301中的项目。此外,在哈希桶301的项目中还存储有节点地址,其直接指向链表302中的一个节点,根据节点地址,也可以直接访问链表302中的节点。由此,哈希桶301与链表302可以实现双向快速定位。
第一获取模块72用于接收存储数据的指令,并从该指令中获取要存储的对象;
例如,当计算装置100需要保存新的映射关系,例如用户与网络连接之间的映射关系时,其可以为该用户创建状态机,然后计算装置100可将创建的状态机传递给专门的存储模块进行存储。可以理解,此处的存储模块是指数据存取模块124中用于进行存储的子功能模块。相应地,存储模块接收存储数据的指令,并获取要存储的对象(例如上述的状态机)。
链表存储模块73用于新分配一个链表的节点模块,并在该节点内写入该对象的序列号以及过期时间;
链表302中的序列号可以是连续进行分配的。过期时间是指超过该时间后存储的对象过期,其所存储的映射关系也不再生效。
链表排序模块74用于将该节点插入到该链表中对应的位置使该链表中所有节点按照过期时间排序;
索引值获取模块75还用于根据该序列号获取一个索引值;
例如,可以直接采用该序列号作为索引值,还可以采用一定的算法根据序列号计算索引值。
在一个实例中,索引值=序列号%SIZE,其中%表示取模操作,而SIZE表示哈希桶301的长度。
存储模块76用于将该对象以及该节点的地址存储在该哈希桶中下标为该索引值的位置。
关于本实施例的装置的其他细节,还可参阅图2以及相关说明。
根据本实施例中的数据存储方法,通过在互相可定位的哈希桶和链表组成的数据结构中,在链表中存储节点以及节点对应的数据,并根据存储位置生成索引值,以在哈希桶中快速定位需要处理的对象,用以实现高效的添加、查找、删除操作。并且,可以快速查找到过期的节点,提高处理过期节点的效率。
第六实施例提供一种数据存取装置,其可用于图1所示的计算装置中。参阅图8,本实施例的装置与图7所示的装置相似,其不同之处在于,还包括:第二获取模块81、返回模块82、第三获取模块83、节点地址获取模块84、模块删除模块85、第四获取模块86以及超时遍历模块87。
其中,第二获取模块81用于接收查找数据的指令并获取查找对象的序列号。
索引值获取模块75,还用于根据第二获取模块81获取的查找对象的序列号获取该查找对象在该哈希桶内的索引值。
返回模块82用于若该哈希桶中与该查找对象的索引值对应的位置不为空则返回该哈希桶中与该目标对象的索引值对应的记录。
第三获取模块83还用于接收删除数据的指令并获取删除对象的序列号;
索引值获取模块75还用于根据该删除对象的序列号获取该删除对象在该哈希桶内的索引值。
节点地址获取模块84用于从该哈希桶中与该删除对象的索引值对应的位置获取该链表中与该删除对象对应的节点的地址;
模块删除模块85用于根据该链表中与该删除对象对应的节点的地址删除对应的节点模块,并将该哈希桶中与该删除对象的索引值对应的位置设置为表示为空的预设值。
第四获取模块86用于接收超时遍历的指令。
超时遍历模块87用于在第四获取模块86获取超遍历的指令后进行以下步骤:
判断当前节点是否已经过期,若已经过期,则:
获取当前节点的序列号;
根据该当前节点的序列号获取对应的索引值;
将该哈希桶中与该当前节点的索引值对应的位置设置为表示为空的预设值并从该链表中删除该当前节点模块。
索引值获取模块75根据该序列号获取一个索引值包括:
根据该序列号与该哈希桶的长度进行取模运算得到一个索引值。
关于本实施例的装置的其他细节,还可参阅图2至图6以及相关说明。
根据本实施例中的数据存储方法,通过在互相可定位的哈希桶和链表组成的数据结构中,在链表中存储节点以及节点对应的数据,并根据存储位置生成索引值,以在哈希桶中快速定位需要处理的对象,用以实现高效的添加、查找、删除操作。并且,可以快速查找到过期的节点,提高处理过期节点的效率。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者装置中还存在另外的相同要素。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述,仅是本发明的较佳实施例,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容做出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。