背景技术
随着企业的全球化及海量数据处理的需求不断发展,证券、银行等大型金融企业积累了海量的用户数据,数据量和用户数的剧增,给这些企业系统带来了很大的压力,高速增长的用户请求以及海量的后台数据给Web系统带来了很多性能问题,导致整个系统响应缓慢,用户体验急剧下降。“要么改进系统,要么流失客户。”正是工业界很多公司不得不面对的问题,如何有效减少用户访问延时,提高系统服务质量是一个迫切需要解决的难题。缓存技术被认为是一种有效的解决方案,它能有效缓解Web系统瓶颈、减少网络数据传输以及提升系统的扩展性。
Web缓存技术可以极大的提高系统的响应速度,在近几年的研究中,提出了很多种缓存方法,它们一般基于数据的一些特性,比如最近访问时间、访问次数、数据大小,数据加载成本以及数据修改时间等,通过对这些基础的数据特征分析采用不同的方法来确定缓存策略,试图尽量减少各种成本度量,从而提高命中率,减少数据访问延时和成本。
目前对于缓存技术的研究主要分为缓存预取方法和缓存替换方法两方面,缓存预取是一种主动式的缓存技术。其基本思想是利用先前用户访问的模式和先验知识,把用户最有可能访问的内容预先加载到缓存中。根据预取算法使用的用户行为特征信息不同,可以分为以下两类:
一、基于多用户的行为模式:利用所有或多个用户的行为模式的特征,不管当前请求的用户是谁,都预取相同的数据,一个典型的例子是根据流行度缓存排在前10的数据。
二、基于单用户的行为模式:这种模式基于对单个用户的行为进行分析,并基于用户的行为模式进行预测,一个典型的例子是利用马尔可夫模型(Markov modeling),其基本思想是根据用户的访问历史建立一个马尔可夫图,并用该图来预测用户下一步的行为。
然而传统的缓存方法要么只是着眼于单个用户的访问习惯,基于当前用户的行为模式进行预测,没有从全盘考虑缓存性能,或者需要加载所有数据才能判断哪些数据是需要缓存的,对于海量数据来说,加载所有数据是不可能的。因此传统的缓存方法并不适合海量数据的应用服务。
发明内容
针对传统缓存方法存在的问题,本发明提供了一种基于装载因子的缓存数据预加载与替换方法,实现在海量数据模式下,对数据的快速预加载和替换。装载因子直观地说就是在Ri次对数据的读请求中数据命中缓存的次数。该方法基于数据的整体分布因子来计算各个数据的装载因子,根据数据的装载因子来判断该数据是否应该放在缓存中。因为装载因子是表示数据命中缓存的次数,因此当装载因子占比数据读取次数Ri超过一定阈值的时候,我们就可以认为该数据更适合预先装载到缓存中,从而在系统初始化的时候采取加载该数据的策略。基于以上描述,给出数据定义如下:
Ri:数据对象i的读请求数;
Pi:在Ri次读请求中,数据对象i命中缓存的次数,即装载因子;
λ:系统的数据分布因子,反应了系统整体的数据分布情况。
基于以上定义,装载因子的数据预加载和替换方法步骤描述如下:
一、计算系统的数据分布因子λ,λ反应系统整体的数据分布,对于符合一定分布模型的系统,比如泊松分布的数据,λ可以从理论上计算得到,对于无法通过理论计算获得λ,需要用数据库统计算法得到;
二、数据预加载,系统启动的时候,加载数据库中的数据,并根据系统的数据分布因子计算该数据的装载因子Pi,根据数据的装载因子确定该数据是否应该预先加载到缓存中,当的时候,加载该数据到缓存中,否则该数据不预加载;
三、系统预加载后缓存数据采用惰性更新的方式,当用户访问某个数据的时候,重新计算该数据的装载因子,根据新的装载因子来判断该数据是放到缓存中还是从缓存中移除;
四、当第三步有新的数据需要装入缓存而缓存数据已满的情况,则采用最近最少使用LRU方法替换缓存中的数据。
五、更新数据分布因子λ,当数据量比较少的时候,对于海量数据系统来说,分布因子λ不会有明显的变化,但当数据累积到一定量后则会影响整个系统的数据分布,为了计算的准确性,需要隔一段时间(比如一天一次)重新计算下分布因子λ。然后再循环采用执行第三步~第五步的步骤,保持缓存中数据的时效性和命中率。
本发明具有如下技术效果:
1、本发明通过数据装载因子可以直接通过计算对数据做出是否缓存的判断,而无须等遍历整个数据后再做出是否缓存的策略,从而使整个缓存系统在系统启动的时候就有很高的命中率。
2、本发明采用惰性更新的方式,系统运行过程中缓存替换的开销很小。
3、在系统的缓存达到动态平衡后,该方法也比传统的缓存替换方法命中率要高,该方法会优先缓存“热点”数据。
4、本发明更适用于海量的数据系统,在海量数据系统中,很多传统的方法无法做出缓存决策,因为它们无法加载比对所有的数据。
具体实施方式
数据定义:
Ri:数据对象i的读请求数,
Si:数据对象i的缓存大小,
MTi:数据对象i从缓存中读取的时延,
DTi:数据对象i未缓存的读取时延,
λ:数据分布因子,
M:总的可用缓存的大小,
n:总的数据个数。
则上述方法过程中的各参数计算公式如下:
推导过程请参照后文所述附加说明。
Pi的计算的附加说明:
1、Pi,即本发明中所述的装载因子,是描述数据在访问时,为了达到最低读取时延所需要的最低缓存命中次数,为了求得此次数,需要经过如下数学推导:
推倒中用到的变量的定义:
Ri:数据对象i的读请求数,
Pi:在Ri次读请求中,数据对象i命中缓存的次数,即装载因子,
Si:数据对象i的缓存大小,
MTi:数据对象i从缓存中读取的时延,
DTi:数据对象i未缓存的读取时延,
M:总的可用缓存的大小,
n:总的数据个数,
a)针对某个数据项的平均读取时延可表示为:
b)系统的TPS(Transaction Per Second)为:
c)假设缓存M被充分利用,那么所有对象读取Ri次,平均情况下则为读取次,总的来讲,从缓存中读取的数据量为因此,可以得到针对TPS的约束条件:
d)以系数λ构建以下拉格朗日函数:
e)根据拉格朗日乘数法求极值的条件,要使TPS取得极值,须满足:
f)由此,可得到:
g)针对变化不大的数据,装载因子Pi可以视为定值,因此,针对这部分数据,可以预先将这部分数据的装载因子计算并存储,在日后的访问过程中直接使用预先存储的装载因子判断是否将目标数据装载入缓存。
λ的计算的附加说明:
1.在某些复杂的缓存系统中,各个缓存数据的读取时间等参数不一致,λ可能比较难计算,但对于一些可以简化的系统,比如对于风险监控项目来说,MTi、DTi、Si等参数可以近似认为是定值,λ计算即可以简化,具体参见下文应用附加说明。
2.λ也可以根据理论的分布模型进行计算,比如对于风险监控项目来说,可以采用泊松分布模型,先求每个账户的平均交易次数,然后认为账户交易次数的分布是基于该平均交易次数周边的泊松分布,那样就只需要知道总的账户个数,然后根据理论分布概率计算不同交易次数的账户个数,那样就不需要从数据库中实际统计各个账户的交易次数,而是直接采用理论模型计算出λ。
应用步骤附加说明:
一、对于不具有先验知识的或先验知识不足且数据变化频繁的系统:
1.当系统不在运行时(维护时、初次安装时),运行数据统计程序,提取数据的特征值,特征值包括数据对象的缓存大小、系统总缓存大小、总的数据数量、未缓存数据的访问时延、已缓存数据的访问时延以及对每个数据的可能请求次数的预估。
2.依据1.中得到的特征使用前述公式计算λ。
3.依据2.中得到的特征使用前述公式计算Pi。
4.比较Pi和预定的阈值,如果Pi较预定的阈值大或与阈值相等,将相对应的数据装载入缓存,否则,就不装载入缓存。
5.在数据更新过程中,在更新的过程中监控数据特征的变化并在一段时间后重新计算。
6.循环采用3~5的步骤,对即将访问的数据进行评估,决定是否装载入缓存。
7.若缓存有空间,直接将数据装在如缓存中;若缓存中没有空间,则选择一种缓存替换算法(预定义的或基于数据特征评估得到的)选择被替换的缓存,并将数据装载入缓存。
二、对于不具有先验知识的或先验知识不足且数据变化不频繁的系统:
1.当系统不在运行时(维护时、初次安装时),运行数据统计程序,提取数据的特征值,特征值包括数据对象的缓存大小、系统总缓存大小、总的数据数量、未缓存数据的访问时延、已缓存数据的访问时延以及对每个数据的可能请求次数的预估。
2.依据1.中得到的特征使用前述公式计算λ。
3.依据2.中得到的特征使用前述公式计算Pi。
4.比较Pi和预定的阈值,如果Pi较预定的阈值大或与阈值相等,将相对应的数据装载入缓存,否则,就不装载入缓存。
5.在数据更新过程中,使用初始值进行计算直到系统停机。
6.循环采用3~5的步骤,对即将访问的数据进行评估,决定是否装载入缓存。
7.若缓存有空间,直接将数据装在如缓存中;若缓存中没有空间,则选择一种缓存替换算法(预定义的或基于数据特征评估得到的)选择被替换的缓存,并将数据装载入缓存。
三、对于具有充分先验知识的且数据变化频繁的系统:
1.当系统不在运行时(维护时、初次安装时),使用先验知识直接得到数据特征值。
2.依据1.中得到的特征使用前述公式计算λ。
3.依据2.中得到的特征使用前述公式计算Pi。
4.比较Pi和预定的阈值,如果Pi较预定的阈值大或与阈值相等,将相对应的数据装载入缓存,否则,就不装载入缓存。
5.在数据更新过程中,在更新的过程中监控数据特征的变化并在一段时间后重新计算。
6.循环采用3~5的步骤,对即将访问的数据进行评估,决定是否装载入缓存。
7.若缓存有空间,直接将数据装在如缓存中;若缓存中没有空间,则选择一种缓存替换算法(预定义的或基于数据特征评估得到的)选择被替换的缓存,并将数据装载入缓存。
四、对于具有充分先验知识的且数据变化不频繁的系统:
1.当系统不在运行时(维护时、初次安装时),使用先验知识直接得到数据特征值。
2.依据1.中得到的特征使用前述公式计算λ。
3.依据2.中得到的特征使用前述公式计算Pi。
4.比较Pi和预定的阈值,如果Pi较预定的阈值大或与阈值相等,将相对应的数据装载入缓存,否则,就不装载入缓存。
5.在数据更新过程中,使用初始值进行计算直到系统停机。
6.循环采用3~5的步骤,对即将访问的数据进行评估,决定是否装载入缓存。
7.若缓存有空间,直接将数据装在如缓存中;若缓存中没有空间,则选择一种缓存替换算法(预定义的或基于数据特征评估得到的)选择被替换的缓存,并将数据装载入缓存。