缓存方法及系统的制作方法

文档序号:7686951阅读:108来源:国知局
专利名称:缓存方法及系统的制作方法
技术领域
本申请涉及计算机网络数据缓存技术领域,特别是涉及一种缓存方法及系统。
背景技术
在web应用中,为了获得较高的响应速度,web服务端通常需要将缓存数据,特别是热点信息的缓存数据,存入到缓存服务器的节点中,然后使用特定的算法将数据分配到不同的缓存区中。当用户提交访问请求时,web服务端首先在缓存服务器节点中查找缓存数据,如果能查找到缓存数据则直接反馈给用户,如果找不到则从磁盘上的文件中读取数据,并将查询的数据写入缓存节点中,从而能快速的对后续请求给出反馈。目前常见的缓存装置,如MemcachecUOSCache,对于只有少量的缓存数据时能够提 供快速的反馈,如果缓存数据量较大时,若从这些缓存装置中读取数据会占用较多的网络资源,造成网络拥塞,影响系统的响应反馈速度。

发明内容
本申请所要解决的技术问题是提供一种缓存方法及系统,能够对缓存数据进行分类,并动态调整缓存中的数据,避免一次性将所有的数据都加载到内存上而造成的内存溢出、系统崩溃等情况。为了解决上述问题,本申请公开了一种缓存方法,包括以下步骤步骤101,计算缓存数据的权重;步骤102,根据所述缓存数据的权重对缓存数据进行排序;步骤103,根据设定的热点缓存数据的阈值对排序后的缓存数据进行分类,将权重排在阈值之前的缓存数据存入热点区,排序在阈值之后的缓存数据存入非热点区。进一步地,所述计算缓存数据的权重包括根据缓存数据的访问数量来计算权重;或根据缓存数据的访问数量与缓存数据总量来计算权重。进一步地,所述计算缓存数据的权重采用的公式为权重=访问数量/缓存数据总量的平方根。进一步地,所述方法还包括在步骤103之后增加如下步骤在预定时间后重新计算缓存数据的权重,并返回步骤102。进一步地,所述方法还包括在步骤103之后增加如下步骤步骤301,在预定时间后重新计算缓存数据的权重;步骤302,比较重新计算后的热点区的最小权重值与非热点区的最大权重值,若热点区的最小权重值小于非热点区的最大权重值,则将热点区中具有最小权重值的缓存数据移到非热点区,并将非热点区中具有最大权重值的缓存数据移到热点区;步骤303,重复步骤302,直到热点区的最小权重值大于非热点区的最大权重值。进一步地,所述方法还包括
对所述热点区的缓存数据采用小根堆排序; 对所述非热点区的缓存数据采用大根堆排序。进一步地,所述方法还包括加载所述热点区的缓存数据到内存。进一步地,加载所述热点区的缓存数据到内存,具体包括当在加载时只将热点区的缓存数据从外部设备中加载到内存,当需要时再从存储缓存数据的外部设备中获取非热点区的缓存数据。
进一步地,所述方法还包括在本次计算权重后到在下次计算权重之前存储本次计算的缓存数据的权重。为了解决上述问题,本发明还公开了一种缓存系统,包括权重计算模块,用于计算缓存数据的权重;排序模块,用于根据缓存数据的权重对缓存数据进行排序;分类模块,根据设定的热点缓存数据的阈值对排序后的缓存数据进行分类,将权重排在阈值之前的缓存数据存入热点区,排序在阈值之后的缓存数据存入非热点区。进一步地,所述系统还包括计时模块,用于计算缓存数据权重调整时间,并触发权重计算模块对缓存数据权
重的重新计算。进一步地,所述系统还包括比较模块,用于比较重新计算权重后的热点区的最小权重值与非热点区的最大权重值,若热点区的最小权重值小于非热点区的最大权重值,则将热点区中具有最小权重值的缓存数据移到非热点区,并将非热点区中具有最大权重值的缓存数据移到热点区。进一步地,所述系统还包括存储模块,用于对每次计算的缓存数据的权重进行存储。进一步地,所述系统还包括加载模块,用于加载所述热点区的缓存数据到内存,具体包括当在加载时只将热点区的缓存数据从外部设备中加载到内存,当需要时再从存储缓存数据的外部设备中获取非热点区的缓存数据。与现有技术相比,本申请包括以下优点本申请的缓存方法及系统通过根据缓存数据的访问频繁程度来对缓存数据进行分类,并在存储所有缓存数据的外部设备,如应用服务器中划分热点区和非热点区,当在加载时可以只将热点区的缓存数据从外部设备中加载到内存,对于非热点区的缓存数据,当需要时再从存储缓存数据的外部设备中获取。这种按照数据热点分布情况加载缓存数据的方式可以避免将所有的缓存数据都加载到内存上而造成的内存溢出、系统崩溃的情况。同时,热点区的缓存数据是访问相对频繁的热点缓存数据,因此可以保证系统的响应速度。其次,本申请在预定时间内对缓存数据的权重重新计算并调整热点区和非热点区的数据,通过实时更新的方式来保证热点区的缓存数据的时效性。另外,在对热点区和非热点区的缓存数据排序时采用不同的排序方式,热点区的缓存数据采用小根堆排序,按照权重从小到大的顺序排列,非热点区的缓存数据采用大根堆排序,按照权重从大到小的顺序排列,在进行缓存数据移动时,可以仅通过比较热点区的最小权重值与非热点区的最大权重值就能得出是否需要移动缓存数据,无需重新去查找数据,能节省调整时间并简化调整步骤。进一步地,在每次调整后会记录缓存数据的权重,避免因为系统突然崩溃或者出现其他故障等情况,在每次计算出缓存数据的权重后,对权重进行存储记录,当重新启动后,能够直接加载存储记录,而无需重新再次计算。当然,实施本申请的任一产品不一定需要同时达到以上所述的所有优点。


图I是本申请的缓存方法实施例一的流程图;图2是本申请的缓存方法实施例二的流程
图3是本申请的缓存方法实施例二的流程图;图4是本申请的缓存系统实施例一的结构示意图;图5是本申请的缓存系统实施例二的结构示意图;图6是本申请的缓存系统实施例三的结构示意图。
具体实施例方式为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式
对本申请作进一步详细的说明。本申请提供一种缓存方法和系统,可以应用于用户需要访问网站所对应的服务器中。具体的,本申请的缓存方法和缓存系统可以通过计算机程序实现,并存储于服务器中,通过处理器的运行来执行。参照图1,示出本申请的一种缓存方法实施例一,包括以下步骤步骤101,计算缓存数据的权重。对于缓存数据的权重可以根据预先设定的公式来计算,在计算权重时一般会考虑缓存数据的访问数量。例如,权重可以直接根据某一缓存数据的访问数量来计算。优先的,因为在不同的情况下,可能会出现访问数量与缓存数据总量比例并不相同的情况,例如,在计算访问次数时,其中一个缓存数据的访问次数为1,而另一缓存数据的访问次数为20,若仅根据访问数量来计算权重时,访问次数为20次的缓存数据的权重会大于访问次数为I的缓存数据。而如果考虑缓存数据总量,若访问次数为I的缓存数据所对应的总量为20条,而访问次数为20的缓存数据所对应的总量已经增加到10万条,那么可以看出,访问次数为I的访问几率实际上大于访问次数20的访问几率。因此,若仅以访问次数来计算权重,特别是在缓存数据总量变化较大时,会影响到权重的合理性。为了使计算的权重更为合理,除了访问数量,还可以考虑缓存数据的总量大小,从而使热点数据的划分结果更为准确。例如,以访问数量与缓存数据总量的比值来计算。进一步地,因为访问数量是用于判断缓存数据是否属于热点数据的重要因素,为了降低缓存数据总量对缓存数据权重的影响,权重还可以通过如下公式来计算权重=访问数量/总量大小的平方根,即增加访问数量对权重的影响。步骤102,根据所述缓存数据的权重对缓存数据进行排序。排序可以采用如堆排序的方式,按照权重值从大到小的方式。
步骤103,根据设定的热点缓存数据的阈值对排序后的缓存数据进行分类,将权重排在阈值之前的缓存数据存入热点区,排序在阈值之后的缓存数据存入非热点区。热点缓存数据的阈值可以根据实际情况来确定,例如用于缓存的内存大小等等,内存越大,设定的阈值也可以越大。例如,设定的热点缓存数据的阈值为2000条,那么就可以将权重排在前2000条缓存数据存入热点区,而2000以后的缓存数据则存入非热点区。本申请的缓存方法通过在存储所有缓存数据的外部设备,如应用服务器中划分热点区和非热点区,当在加载时可以只将热点区的缓存数据加载到内存,对于非热点区的缓存数据,当需要时再从存储缓存数据的数据库中获取。这种按照数据热点分布情况加载缓存数据的方式可以避免将所有的缓存数据都加载到内存上而造成的内存溢出、系统崩溃的情况。同时,加载的缓存数据是访问相对频繁的热点缓存数据,因此可以保证系统的响应速度。参照图2,示出本申请的缓存方法实施例二,进一步地,在实施例一的步骤103之后还包括如下步骤步骤201,在预定时间后重新计算缓存数据的权重,并返回步骤102。因为访问数量会随着时间的变化而变化,所以热点缓存数据也会因为时间的变化而变化,为了使热点区所存储的缓存数据为当前时间的热点缓存数据,可以预先设定缓存数据的调整时间,在到达调整时间时则重新计算缓存数据的权重。例如,可以将调整时间设置为一小时,二小时或者半天等等。具体的,可以通过设置计时器来实现,当计时器显示当前时间距离上次权重计算时间已经到达调整时间后,则触发重新计算缓存数据的权重。并根据重新计算的权重再次对缓存数据进行排序以重新区分热点区和非热点区的缓存数据。参照图3,示出本申请的缓存方法实施例三,进一步地,在实施例一的步骤103之后还包括如下步骤步骤301,在预定时间后重新计算缓存数据的权重。步骤302,比较重新计算权重后的热点区的最小权重值与非热点区的最大权重值,若热点区的最小权重值小于非热点区的最大权重值,则将热点区中具有最小权重值的缓存数据移到非热点区,并将非热点区中具有最大权重值的缓存数据移到热点区。步骤303,重复步骤302,直到热点区的最小权重值大于非热点区的最大权重值。进一步地,为了减少调整时间,热点区和非热点区的缓存数据都可以采用堆排序的方式来进行排序。其中,热点区的缓存数据采用小根堆排序,按照权重从小到大的顺序排列,即权重最小的排队首,权重最大的排队尾。非热点区的缓存数据采用大根堆排序,按照权重从大到小的顺序排列,即权重最大的排队首,权重最小的排队尾。在比较热点区和非热点区的权重值大小时,则可以直接将热点区队首的权重值与非热点区的队尾的权重值比较即可,无需重新去查找数据,能节省调整时间并简化调整步骤。在重新区分热点缓存数据和非热点缓存数据后,可以按照热点区和非热点区原定的排序方式对各自的数据重新排序,以备后续使用。进一步地,本申请的缓存方法实施例还包括存储热点区和非热点区的缓存数据的权重。为了避免因为系统突然崩溃或者出现其他故障等情况,在每次计算出缓存数据的权重后,对热点区和非热点区的缓存数据的权重进行存储记录,当重新启动后,能够直接加载存储记录,而无需重新再次计算。其中,缓存数据的权重可以在每次计算后到在下次计算之前这段时间内存储。当然,为了保证存储的及时性,可以在权重值被计算出的同时就存储。可以理解,对于缓存数据的权重的存储也可以区分热点区和非热点区,即将热点区的权重作为一组数据存储,将非热点区的权重作为另一组数据存储。下面结合具体的实例对本申请的缓存方法进行详细的说明,假设本申请采用Hotspot Cache (热点区缓存),缓存数据为类目数据。首先,对本实例中的类目和缓存数据结构进行说明。在电子商务网站中商品信息的类目体系中,类目是一种树形的结构,每一个类目形成一颗类目树,类目树由属性和属性值组成。每个类目可以由具有描述该类目特征的相关属性来确定,而这些属性称为该类目的关键属性。由这些属性和其关联的属性值形成的路径,就是关键路径(spuPath)。其中,一个类目下面可能会对应多个关键路径,每一个关键路径对应一个标准化产品单元标号(spuld, standard product unit Identity),通过标准化产品单元标号可以获取到相关信息。在缓存数据载入或者查询时,通常是通过输入类目标号(categoryld),找到对应的关键路径,然后通过关键路径来获取标准化产品单元标号,从而最终获取到相关信息。具体的, 在进行存储时,每个类目作为独立的文件缓存在应用服务器中。其中,每个类目的缓存数据是以key-value的形式存储在内存中,在进行查询时,通过获取key的值,便可以找到对应的value值。因此,本实例的每个类目的缓存数据可以通过两个key-value的形式来实现存储,首先,以类目标号为key,关键路径的封装(spuldstore)为value,然后再以关键路径为key,以标准化产品单元标号为value存储在缓存中。当需要对缓存数据进行查询时,在输入类目标号后,便可以获取到关键路径的封装,从而获取到关键路径,最终获取到标准化产品单元标号。在对类目进行缓存时,每个类目作为一个独立的文件存在服务器上,通过类目树加载服务(CatTreeLoadServic)将磁盘上所有类目文件加载到应用服务器的缓存中。同时将上一次的热点记录文件加载入Hotspot Cache中,保证了热点记录的连续。其中,根据权重对缓存队列进行分类,权重队列weightQueue有两种,分别为热点区的缓存队列(cacheWeightQueue)和非热点区的待缓存队列(uncacheWeightQueue)。WeightQueue 是带权重的基于 JDK (Java Development Kit)中 PriorityQueue 的封装和实现。对缓存数据的权重队列的调整根据访问数量和数据总量来确定。访问数量指某一类目被访问的次数,数据总量指类目树的总量。权重的计算公式为权重=访问数量/数据总量的平方根,即W = accessCount/Math. pow (capacity, 0. 5)。设置调整缓存权重队列的期限值AdjustPeriod,当访问时间为所设置的调整期限值的整数倍时,将触发对cacheWeightQueue和uncacheWeightQueue的数据权重调整。在每次调整后需要记录缓存中数据的权重值,也即热点快照。DumpPeriod,是dump缓存数据的周期值,DumpTask则是将当前时间缓存权重队列数据的热点快照记录下来的特殊任务。Hotspot Cache预先设置默认的DumpPeriod,当符合访问量是dump周期的整数倍时,将dump当前时刻cacheWeightQueue和uncacheWeightQueue中的权重值的热点快照dump成文件,并保存于磁盘中,以备下次数据初始化时使用。缓存中分成热点区和非热点区两个区块。热点区由cacheWeightQueue构成,非热点区由不活跃的缓存数据在unCacheWeightQueue组成。根据队列中的权重大小,决定哪些数据在什么时候进入热点区,哪些数据会被移出热点区进入非热点区。其中,采用实现缓存权重更新策略的任务 MemeryAjustTask,对 cacheWeightQueue 和 uncacheWeightQueue 中的数据进行权重大小的排序。对于cacheWeightQueue中的数据,按由小到大排序,权重小的排队首,权重大的排队尾。而uncacheWeightQueue的数据,则相反,按由大到小排序,权重大的排队首,权重小的排队尾。根据缓存调整策略,当uncacheWeightQueue的队首元素权重值大于cacheWeightQueue的队首元素权重值,则将uncacheWeightQueue的队首元素出队,同时将该元素放入cacheWeightQueue的队尾,同时cacheWeightQueue的队首元素出队,放入 uncacheWeightQueue 的队尾。为了提高WeightQueue的排序效率,在WeightQueue中为提升队列中数据量很大的时候排序效率,使用Binary Heap排序,cacheWeightQueue使用小根堆排序,uncacheWeightQueue使用大根堆排序。参照图4,示出本申请的一种缓存系统实施例一,此处的系统中的各个模块是指基于计算机语言编写的计算机程序,存储于服务器中,并通过处理器运行。缓存系统包括权重 计算模块10、排序模块20和分类模块30。权重计算模块10,用于计算缓存数据的权重。其中,权重的计算可以根据预先设定的公式来实现,例如通过访问数量或者访问数量与数据大小的关系等等。排序模块20,用于根据缓存数据的权重对缓存数据进行排序。具体的,可以按照权重值从小到大或者从大到小的方式排列,例如,采用Binary Heap排序。分类模块30,根据设定的热点缓存数据的阈值对排序后的缓存数据进行分类,将权重排在阈值之前的缓存数据存入热点区,排序在阈值之后的缓存数据存入非热点区。可以预先在分类模块30中设定阈值,根据阈值来对缓存数据进行分类,并存入对应的区域。加载模块70,用于加载所述热点区的缓存数据到内存,具体包括当在加载时只将热点区的缓存数据从外部设备中加载到内存,当需要时再从存储缓存数据的外部设备中获取非热点区的缓存数据。参照图5,示出本申请的一种缓存系统实施例二,进一步地,还包括计时模块40,用于计算缓存数据权重调整时间,并触发权重计算模块对缓存数据的权重重新进行计算。在计时模块中预先设定调整时间,当到达调整时间后触发权重计算模块10重新计算缓存数据的权重,并再次进行排序后分类。参照图6,进一步地,本申请的缓存系统还包括比较模块50和存储模块60。比较模块50,用于比较重新计算权重后的热点区的最小权重值与非热点区的最大权重值,若热点区的最小权重值小于非热点区的最大权重值,则将热点区中具有最小权重值的缓存数据移到非热点区,并将非热点区中具有最大权重值的缓存数据移到热点区,从而对热点区和非热点区的缓存数据进行调整。如此循环,直到热点区的最小权重大于非热点区的最大权重值,则停止比较。存储模块60,用于对热点区和非热点区的缓存数据的权重进行存储,以备后续使用。本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于系统实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。以上对本申请所提供的缓存方法及系统进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方 法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
权利要求
1.一种缓存方法,其特征在于,包括以下步骤 步骤101,计算缓存数据的权重; 步骤102,根据所述缓存数据的权重对缓存数据进行排序; 步骤103,根据设定的热点缓存数据的阈值对排序后的缓存数据进行分类,将权重排在阈值之前的缓存数据存入热点区,排序在阈值之后的缓存数据存入非热点区。
2.如权利要求I所述的方法,其特征在于,所述计算缓存数据的权重包括 根据缓存数据的访问数量来计算权重;或 根据缓存数据的访问数量与缓存数据总量来计算权重。
3.如权利要求I或2所述的方法,其特征在于,所述计算缓存数据的权重采用的公式为权重=访问数量/缓存数据总量的平方根。
4.如权利要求I所述的方法,其特征在于,所述方法还包括在步骤103之后增加如下步骤 在预定时间后重新计算缓存数据的权重,并返回步骤102。
5.如权利要求I所述的方法,其特征在于,所述方法还包括在步骤103之后增加如下步骤 步骤301,在预定时间后重新计算缓存数据的权重; 步骤302,比较重新计算后的热点区的最小权重值与非热点区的最大权重值,若热点区的最小权重值小于非热点区的最大权重值,则将热点区中具有最小权重值的缓存数据移到非热点区,并将非热点区中具有最大权重值的缓存数据移到热点区; 步骤303,重复步骤302,直到热点区的最小权重值大于非热点区的最大权重值。
6.如权利要求5所述的方法,其特征在于,所述方法还包括 对所述热点区的缓存数据采用小根堆排序; 对所述非热点区的缓存数据采用大根堆排序。
7.如权利要求1、4或5所述的方法,其特征在于,所述方法还包括 加载所述热点区的缓存数据到内存。
8.如权利要求7所述的方法,其特征在于,加载所述热点区的缓存数据到内存,具体包括当在加载时只将热点区的缓存数据从外部设备中加载到内存,当需要时再从存储缓存数据的外部设备中获取非热点区的缓存数据。
9.如权利要求I所述的方法,其特征在于,所述方法还包括 在本次计算权重后到在下次计算权重之前存储本次计算的缓存数据的权重。
10.一种缓存系统,其特征在于,包括 权重计算模块,用于计算缓存数据的权重; 排序模块,用于根据缓存数据的权重对缓存数据进行排序; 分类模块,根据设定的热点缓存数据的阈值对排序后的缓存数据进行分类,将权重排在阈值之前的缓存数据存入热点区,排序在阈值之后的缓存数据存入非热点区。
11.如权利要求10所述的系统,其特征在于,所述系统还包括 计时模块,用于计算缓存数据权重调整时间,并触发权重计算模块对缓存数据权重的重新计算。
12.如权利要求11所述的系统,其特征在于,所述系统还包括比较模块,用于比较重新计算权重后的热点区的最小权重值与非热点区的最大权重值,若热点区的最小权重值小于非热点区的最大权重值,则将热点区中具有最小权重值的缓存数据移到非热点区,并将非热点区中具有最大权重值的缓存数据移到热点区。
13.如权利要求11或12所述的系统,其特征在于,所述系统还包括 存储模块,用于对每次计算的缓存数据的权重进行存储。
14.如权利要求10所述的系统,其特征在于,所述系统还包括 加载模块,用于加载所述热点区的缓存数据到内存,具体包括当在加载时只将热点区的缓存数据从外部设备中加载到内存,当需要时再从存储缓存数据的外部设备中获取非热点区的缓存数据。
全文摘要
本申请提供了一种缓存方法,包括计算缓存数据的权重;根据所述缓存数据的权重对缓存数据进行排序;根据设定的热点缓存数据的阈值对排序后的缓存数据进行分类,将权重排在阈值之前的缓存数据存入热点区,排序在阈值之后的缓存数据存入非热点区。本申请还提供一种实现前述方法的缓存系统。本申请的缓存方法及系统,能够对缓存数据进行分类,并动态调整缓存中的数据,避免一次性将所有的数据都加载到内存上而造成的内存溢出、系统崩溃等情况。
文档编号H04L29/08GK102821113SQ201110151049
公开日2012年12月12日 申请日期2011年6月7日 优先权日2011年6月7日
发明者王宏江, 农子盛 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1