一种数据存储方法和装置的制作方法

文档序号:6433270阅读:128来源:国知局
专利名称:一种数据存储方法和装置的制作方法
技术领域
本申请涉及数据存储技术领域,特别是涉及一种数据存储方法和装置。
背景技术
目前,一些在线应用程序在处理业务请求的过程中,通常需要动态从数据库读取响应记录然后进行逻辑处理。对于某些大规模的在线应用程序而言,一个业务请求通常会涉及到两个或多个模块的协同处理,这些模块在处理同一业务请求的时候很难避免多次从数据库重复读取对象数据。例如,某个业务请求需要模块I和模块2的协同处理,其中,模块I和模块2分别为不同的开发人员开发的模块,其提供的输入参数均是数据库对象ID(标识符,IDentity);这样,当这个业务请求的处理经过模块I的时候,模块I根据数据库对象ID从数据库读取对象数据,而当该处理经过模块2的时候,模块2又不得不从数据库再读取一次相同的对象数据。为了提高业务请求处理的效率,一种现有技术采用数据缓存机制,即在模块I读取数据完成后,将数据库对象ID和相应的对象数据关联存储至KV(键/值,Key/Value)Cache (缓存);这样,当该处理经过模块2的时候,模块2首先尝试从Cache中读取数据,如果读取成功则无需再从数据库中读取数据;该数据缓存机制能够减少在大量的数据库读取动作中因1/0(输入/输出,Input/Output)引起的资源消耗。但是,为了确保模块2从Cache中读取到的数据和数据库中数据的一致性,必须针对Cache采取加锁机制,否则模块2从该Cache读取到的数据可能是过时的和不一致的,从而导致模块2的处理结果错误。但是,这种加锁机制又会引发新的性能问题,因为一旦对该Cache申请了加锁,其它业务请求的处理不得不阻塞等待,直至该Cache被解锁或被释放,而所述阻塞等待会反过来影响业务请求处理的并发性和效率。

发明内容
本申请所要解决的技术问题是,提供一种数据存储方法和装置,其在业务请求的处理过程中存储对象数据,以减少数据库访问次数,提高业务请求处理的并发性和效率。为了解决上述问题,本申请一种数据存储方法,包括在业务请求的处理过程中,依据数据库对象ID和线程ID生成键值,其中,所述线程ID为处理所述业务请求的线程ID ;将所述键值和所述键值中数据库对象ID对应的对象数据进行关联,并存储至缓存。优选的,所述方法还包括在所述业务请求的处理过程中,如果需要用到某一数据库对象ID对应的对象数据,则依据该数据库对象ID和所述线程ID生成查找键值;依据所述查找键值在所述缓存中进行查找,若缓存命中,则返回与所述查找键值相应的对象数据,若缓存命不中,则依据所述查找键值中的数据库对象ID从数据库中读取相应的对象数据并返回。优选的,所述方法还包括在所述业务请求的处理过程中,如果对所述对象数据进行修改,则对所述缓存中存储的相同对象数据进行更新。优选的,所述方法还包括在所述业务请求的处理结束时,对所述缓存进行回收。优选的,所述方法还包括在所述业务请求的处理结束时,首先依据数据库对象ID,将所述缓存中存储的相应对象数据同步到数据库,然后对所述缓存进行回收。另一方面,本申请还公开了一种数据存储装置,包括键值生成模块,用于在业务请求的处理过程中,依据数据库对象ID和线程ID生成键值,其中,所述线程ID为处理所述业务请求的线程ID ;及存储模块,用于将所述键值和所述键值中数据库对象ID对应的对象数据进行关联,并存储至缓存。优选的,所述方法还包括查找键值生成模块,用于在所述业务请求的处理过程中,如果需要用到某一数据库对象ID对应的对象数据,则依据该数据库对象ID和所述线程ID生成查找键值;查找模块,用于依据所述查找键值在所述缓存中进行查找,若缓存命中,则触发返回模块,否则触发读取模块;返回模块,用于在缓存命中时,返回与所述查找键值相应的对象数据;读取模块,用于在缓存命不中时,依据所述查找键值中的数据库对象ID从数据库中读取相应的对象数据并返回。优选的,所述方法还包括更新模块,用于在所述业务请求的处理过程中,如果对所述对象数据进行修改,则对所述缓存中存储的相同对象数据进行更新。优选的,所述方法还包括第一回收模块,用于在所述业务请求的处理结束时,对所述缓存进行回收。优选的,所述方法还包括同步模块,用于在所述业务请求的处理结束时,依据数据库对象ID,将所述缓存中存储的相应对象数据同步到数据库;第二回收模块,用于在所述同步完成后,对所述缓存进行回收。与现有技术相比,本申请具有以下优点本申请在业务请求的处理过程中,依据数据库对象ID和线程ID生成键值(Key),并将所述键值和所述键值中数据库对象ID对应的对象数据(Value)进行关联,存储至缓存。首先,对于处理业务请求的线程而言,其具有唯一的线程ID,故本申请的存储使得各业务请求的处理具有各自不同的、相互独立和相互隔离的Cache地址空间,对于当前业务请求而言,则能够避免其它业务请求对自身Cache地址空间的干扰,在不加锁的情况下,也能够确保当前业务请求的后续处理从Cache中读取到的数据和数据库中数据的一致性。
其次,由于各业务请求的处理具有各自不同的相互独立和相互隔离的Cache地址空间,这样,多个业务请求的处理线程不再共享Cache地址空间,也就能够避免Cache地址空间请求失效,以及不得不阻塞等待直至该Cache被解锁或被释放的情况,所以本申请不会影响业务请求处理的并发性和效率。再者,针对一些在线应用程序的中间计算结果是不能被简单的清除掉的特性,本申请在所述业务请求的整个处理过程中,还可以将针对对象数据进行的所有修改都存储在缓存中,由于后续处理能够用到前序处理的结果数据,因此,能够在一个业务请求的处理生命周期里始终保证该块缓存的可用性,既能够保证对象数据在内存中的可用性,又能够保证内存的及时回收。


图1是本申请一种数据存储方法实施例的流程图;图2是本申请一种在线应用程序在业务请求的处理过程中使用Memcached缓存对象数据的流程图;图3是本申请一种数据存储装置实施例的结构图。
具体实施例方式为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式
对本申请作进一步详细的说明。在线应用程序通常会收到很多并发的业务请求,为了提高业务请求处理的并发性和效率,其往往分配多个线程去并发执行这些业务请求;这些多线程看上去似乎在并行执行它们各自的工作,但实际上这些多线程共享地址空间,也即,多个线程能够读写相同的变量或数据结构。这样,在业务请求I的处理过程中,如果不申请加锁,则Cache中存储的对象数据会被其它业务请求共享,而一旦其它业务请求修改了 Cache中存储的对象数据,则业务请求I的后续处理(如模块2)从Cache读取到的数据可能是过时的,和数据库中数据相比不
一致的。本申请实施例的核心构思之一在于,将各业务请求的Cache地址空间隔离开来,具体而言,在业务请求的处理过程中,依据数据库对象ID和线程ID生成键值,将所述键值和所述键值中数据库对象ID对应的对象数据进行关联,并存储至缓存。由于各业务请求的处理具有各自不同的、独立的Cache地址空间,对于当前业务请求而言,能够避免其它业务请求对自身Cache地址空间的干扰,不仅能够确保当前业务请求的后续处理从Cache中读取到的数据和数据库中数据的一致性,而且能够避免加锁带来的性能问题。参照图1,其示出了本申请一种数据存储方法实施例的流程图,具体可以包括步骤101、在业务请求的处理过程中,依据数据库对象ID和线程ID生成键值,其中,所述线程ID为处理所述业务请求的线程ID ;步骤102、将所述键值和所述键值中数据库对象ID对应的对象数据进行关联,并存储至缓存。
在实际应用中,在线应用程序通常会收到很多并发的业务请求,为了提高业务请求处理的并发性和效率,其往往分配多个线程去并发执行这些业务请求。这里,在线应用程序主要指带网络连接或需要网络连接才能使用的程序,其可以是B/S (浏览器/服务器,Browser/Server)结构,如网络邮箱、网络博客、网络微博、网络论坛、即时通讯等需要浏览器支持的程序。本申请对具体的在线应用程序不加以限制。至于如何获取各线程的线程ID,本申请可以提供如下方法方法一、调用GetCurrentThreadIdO函数,该函数的返回值就是当前线程一个唯一的线程ID (标识符,IDentity);方法二、在创建线程时获得相应的线程ID,例如,使用如下函数创建新的线程,m_hThread = : : CreateThread (NULL, O, MyThreadProc, this, O, &m_threadID),该函数的最后一个参数就是线程ID。当然,除了上述方法外,本领域技术人员还可以采用其它方法来获取各线程的线程ID,本申请对具体的获取各线程的线程ID的方法不加以限制。本申请在业务请求的处理过程中,依据数据库对象ID和线程ID生成键值(Key),并将所述键值和所述键值中数据库对象ID对应的对象数据(Value)进行关联,存储至缓存。对于处理业务请求的线程而言,其具有唯一的线程ID,故本申请的存储使得各业务请求的处理具有各自不同的、独立的Cache地址空间,对于当前业务请求而言,则能够避免其它业务请求对自身Cache地址空间的干扰,在不加锁的情况下,也能够确保当前业务请求的后续处理从Cache中读取到的数据和数据库中数据的一致性;进一步,由于各业务请求的处理具有各自不同的、独立的Cache地址空间,这样,多个业务请求的处理线程不再共享Cache地址空间,也就能够避免Cache地址空间请求失效,以及不得不阻塞等待直至该Cache被解锁或被释放的情况,所以本申请不会影响业务请求处理的并发性和效率。在本申请的一种优选实施例中,所述方法还可以包括在所述业务请求的处理过程中,如果需要用到某一数据库对象ID对应的对象数据,则依据该数据库对象ID和所述线程ID生成查找键值;依据所述查找键值在所述缓存中进行查找,若缓存命中,则返回与所述查找键值相应的对象数据,若缓存命不中,则依据所述查找键值中的数据库对象ID从数据库中读取相应的对象数据并返回。在具体实现中,可采用分布式内存对象缓存系统来实现所述缓存方案。例如,Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap (哈希图)。其守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。参照图2,其示出了本申请一种在线应用程序在业务请求的处理过程中使用Memcached缓存对象数据的流程图。图中的在线应用程序为Web (网页)应用程序,其将对象数据保存到RDBMS (关系型数据库管理系统,relational database management system)中。在业务请求的处理过程中,在首次访问时,应用服务器从RDBMS中取得对象数据后并保存至Memcached,在第二次及以后访问时,应用服务器会从Memcached中取得对象数据并在浏览器中显示。总之,Memcached通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。由于查找键值是依据数据库对象ID和所述线程ID生成的,而线程ID对于一个业务请求而言是唯一的,也即一个业务请求不会知道其它业务请求的线程ID,更不会访问到其它业务请求的Cache地址空间,从而能够保证各业务请求的Cache地址空间的相互独立性、相互隔离性和抗干扰性。在本申请的另一种优选实施例中,所述方法还可以包括在所述业务请求的处理过程中,如果对所述对象数据进行修改,则对所述缓存中存储的相同对象数据进行更新。假设某个业务请求需要模块I和模块2的协同处理,也即,当这个业务请求的处理经过模块I的时候,模块I根据数据库对象ID从数据库读取对象数据,并且,依据数据库对象ID和线程ID生成键值,将所述键值和所述键值中数据库对象ID对应的对象数据进行关联,存储在缓存;那么,如果在模块I在处理过程中对所述对象数据进行修改,例如将价格ID的数据值从“I”修改为“2”,则缓存中应对这个价格ID的数据值进行同步,使该业务请求的后续模块(如模块2)用到模块I的处理结果。现有技术在使用KV Cache时,由于Cache的总大小是有限的,这样,在基于LRU(最近最少使用,Least Recently Used)原理进行内存管理时,很有可能把Cache的对象数据清空,导致模块I的计算结果被清除掉;为了避免这种问题,模块I在修改内存后还需要立即修改数据库。但是,这样修改的同时又得修改数据库,降低了性能,显然会使Cache的应用失去了意义。为了既保证对象数据在内存中的可用性又保证内存的及时回收,在本申请的再一种优选实施例中,所述方法还可以包括在所述业务请求的处理结束时,对所述缓存进行回收。在实际中,可以在所述业务请求的结束函数中,进行本次业务请求的处理过程中存储到缓存的对象数据的回收,所述回收也即将驻留在缓存中的对象数据从内存中释放出来,以提高系统内存资源的利用率,进而提升系统性能。进一步,在所述业务请求的处理过程中,如果对所述对象数据进行修改,则对所述缓存中存储的相同对象数据进行更新的情况下,所述方法还可以包括在所述业务请求的处理结束时,首先依据数据库对象ID,将所述缓存中存储的相应对象数据同步到数据库,然后对所述缓存进行回收。因为一些在线应用程序的中间计算结果是不能被简单的清除掉的,本优选实施例在所述业务请求的整个处理过程中,将针对对象数据进行的所有修改都存储在缓存中,后续处理能够用到前序处理的结果数据,因此,能够在一个业务请求的处理生命周期里始终保证该块缓存的可用性。为使本领域技术人员更好地理解本申请,以下通过一个具体的业务处理的流程示例来说明本申请的数据存储方法在实际用的应用;所述示例涉及某个业务请求需要模块I和模块2的协同处理,其中,当这个业务请求的处理经过模块I和模块2的时候,都需要用到某一数据库对象ID对应的对象数据;所述业务处理的流程具体可以包括步骤S1、当这个业务请求的处理经过模块I的时候,依据数据库对象ID从数据库中读取相应的对象数据;步骤S2、获取处理所述业务请求的线程ID ;步骤S3、依据所述数据库对象ID和线程ID生成键值;步骤S4、将所述键值和所述键值中数据库对象ID对应的对象数据进行关联,并存储至缓存;步骤S5、模块I在处理所述业务请求的过程中,对所述数据库对象ID对应的对象数据进行修改,并对所述缓存中存储的相同对象数据进行更新;步骤S6、模块2处理所述业务请求需要用到所述数据库对象ID对应的对象数据,于是依据所述数据库对象ID和所述线程ID生成查找键值;步骤S7、依据所述查找键值在所述缓存中进行查找,缓存命中,且返回与所述查找键值相应的对象数据;步骤S8、模块2在处理所述业务请求的过程中,对所述数据库对象ID对应的对象数据进行修改,并对所述缓存中存储的相同对象数据进行更新;步骤S9、在所述业务请求的处理结束时,首先依据数据库对象ID,将所述缓存中存储的相应对象数据同步到数据库,然后对所述缓存进行回收。需要说明的是,上述示例中2个模块的协同处理,模块I和模块2分别修改对象数据等整个业务处理的流程均是作为示例,实际上,本领域技术人员可以根据实际需求,灵活地将本申请的数据存储方法应用到业务处理流程中,本申请对此不加以限制。与前述方法实施例相应,本申请还公开了一种数据存储装置实施例,参照图3,具体可以包括键值生成模块301,用于在业务请求的处理过程中,依据数据库对象ID和线程ID生成键值,其中,所述线程ID为处理所述业务请求的线程ID ;及存储模块302,用于将所述键值和所述键值中数据库对象ID对应的对象数据进行关联,并存储至缓存。在本申请的一种优选实施例中,所述装置还可以包括查找键值生成模块,用于在所述业务请求的处理过程中,如果需要用到某一数据库对象ID对应的对象数据,则依据该数据库对象ID和所述线程ID生成查找键值;查找模块,用于依据所述查找键值在所述缓存中进行查找,若缓存命中,则触发返回模块,否则触发读取模块;返回模块,用于在缓存命中时,返回与所述查找键值相应的对象数据;读取模块,用于在缓存命不中时,依据所述查找键值中的数据库对象ID从数据库中读取相应的对象数据并返回。在本申请的另一种优选实施例中,所述装置还可以包括更新模块,用于在所述业务请求的处理过程中,如果对所述对象数据进行修改,则对所述缓存中存储的相同对象数据进行更新。在本申请的再一种优选实施例中,所述装置还可以包括第一回收模块,用于在所述业务请求的处理结束时,对所述缓存进行回收。
在本申请的一种优选实施例中,所述装置还可以包括同步模块,用于在所述业务请求的处理结束时,依据数据库对象ID,将所述缓存中存储的相应对象数据同步到数据库;第二回收模块,用于在所述同步完成后,对所述缓存进行回收。对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。以上对本申请所提供的一种数据存储方法和装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
权利要求
1.一种数据存储方法,其特征在于,包括 在业务请求的处理过程中,依据数据库对象ID和线程ID生成键值,其中,所述线程ID为处理所述业务请求的线程ID ; 将所述键值和所述键值中数据库对象ID对应的对象数据进行关联,并存储至缓存。
2.如权利要求1所述的方法,其特征在于,还包括 在所述业务请求的处理过程中,如果需要用到某一数据库对象ID对应的对象数据,则依据该数据库对象ID和所述线程ID生成查找键值; 依据所述查找键值在所述缓存中进行查找,若缓存命中,则返回与所述查找键值相应的对象数据,若缓存命不中,则依据所述查找键值中的数据库对象ID从数据库中读取相应的对象数据并返回。
3.如权利要求1所述的方法,其特征在于,还包括 在所述业务请求的处理过程中,如果对所述对象数据进行修改,则对所述缓存中存储的相同对象数据进行更新。
4.如权利要求1所述的方法,其特征在于,还包括 在所述业务请求的处理结束时,对所述缓存进行回收。
5.如权利要求3所述的方法,其特征在于,还包括 在所述业务请求的处理结束时,首先依据数据库对象ID,将所述缓存中存储的相应对象数据同步到数据库,然后对所述缓存进行回收。
6.一种数据存储装置,其特征在于,包括 键值生成模块,用于在业务请求的处理过程中,依据数据库对象ID和线程ID生成键值,其中,所述线程ID为处理所述业务请求的线程ID ;及 存储模块,用于将所述键值和所述键值中数据库对象ID对应的对象数据进行关联,并存储至缓存。
7.如权利要求6所述的装置,其特征在于,还包括 查找键值生成模块,用于在所述业务请求的处理过程中,如果需要用到某一数据库对象ID对应的对象数据,则依据该数据库对象ID和所述线程ID生成查找键值; 查找模块,用于依据所述查找键值在所述缓存中进行查找,若缓存命中,则触发返回模块,否则触发读取模块; 返回模块,用于在缓存命中时,返回与所述查找键值相应的对象数据; 读取模块,用于在缓存命不中时,依据所述查找键值中的数据库对象ID从数据库中读取相应的对象数据并返回。
8.如权利要求6所述的装置,其特征在于,还包括 更新模块,用于在所述业务请求的处理过程中,如果对所述对象数据进行修改,则对所述缓存中存储的相同对象数据进行更新。
9.如权利要求6所述的装置,其特征在于,还包括 第一回收模块,用于在所述业务请求的处理结束时,对所述缓存进行回收。
10.如权利要求8所述的装置,其特征在于,还包括 同步模块,用于在所述业务请求的处理结束时,依据数据库对象ID,将所述缓存中存储的相应对象数据同步到数据库;第二回收 模块,用于在所述同步完成后,对所述缓存进行回收。
全文摘要
本申请提供了一种数据存储方法和装置,其中的数据存储方法包括在业务请求的处理过程中,依据数据库对象ID和线程ID生成键值,其中,所述线程ID为处理所述业务请求的线程ID;将所述键值和所述键值中数据库对象ID对应的对象数据进行关联,并存储至缓存。本申请在业务请求的处理过程中存储对象数据,以减少数据库访问次数,提高业务请求处理的并发性和效率。
文档编号G06F17/30GK102999522SQ20111027428
公开日2013年3月27日 申请日期2011年9月15日 优先权日2011年9月15日
发明者佘智勇 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1