发明内容
为了解决现有缓存技术存在的难以对细粒度数据进行缓存以及缓存处理功能模块和业务逻辑功能模块紧密耦合的问题,本发明的目的在于提供一种基于AOP技术缓存函数执行结果的方法及系统,从而实现企业应用系统数据细粒度的缓存,大幅度的提高系统运行性能,使得业务系统使用的人越多,被缓存的数据就越多,系统运行地越快。
为实现上述目的,本发明采用的技术方案如下:
一种基于AOP技术缓存函数执行结果的方法,包括以下步骤:
步骤1、调用业务逻辑处理函数,并由特征码生成装置生成该业务逻辑处理函数唯一的实例特征码;
步骤2、根据业务逻辑处理函数的实例特征码,在数据缓存装置中检索是否存在该函数的函数执行结果,若是则进入步骤3,若否则进入步骤4;
步骤3、从数据缓存装置中得到缓存的函数执行结果,进入步骤5;
步骤4、执行所述业务逻辑处理函数,并将得到的函数执行结果缓存到数据缓存装置;
步骤5、将函数执行结果返回给业务逻辑处理函数的调用方。
进一步,如上所述的一种基于AOP技术缓存函数执行结果的方法,如果步骤1中所调用的业务逻辑处理函数为更新目标数据的函数,会将数据缓存装置中该函数所在类对应的缓存数据进行清除。
进一步,如上所述的一种基于AOP技术缓存函数执行结果的方法,清除函数所在类对应的缓存数据的具体步骤为:
1)调用修改目标数据的业务逻辑处理函数;
2)执行所调用的更新目标数据的业务逻辑处理函数,并获取被执行函数所在类名;
3)获取数据缓存装置的函数实例特征码列表,将实例特征码列表中的每个函数实例特征码与步骤2)被执行函数所在类名进行对比,并删除数据缓存装置中以被执行函数所在类名开头的实例特征码所对应的缓存数据。
进一步,如上所述的一种基于AOP技术缓存函数执行结果的方法,步骤1中,所述业务逻辑处理函数为面向对象开发语言Java语言的对象成员函数。
进一步,如上所述的一种基于AOP技术缓存函数执行结果的方法,步骤1中,实例特征码是根据函数实例的类名、函数名和参数信息生成的,以类名开头的唯一的函数实例特征码。
进一步,如上所述的一种基于AOP技术缓存函数执行结果的方法,所述参数是Java语言的基本数据类型、数组或对象类型,参数的个数为一个、多个或者没有。
进一步,如上所述的一种基于AOP技术缓存函数执行结果的方法,在数据缓存装置中检索函数执行结果是以函数的实例特征码为依据进行的,在缓存时是以实例特征码为主键将函数执行结果存入到数据缓存装置的。
进一步,如上所述的一种基于AOP技术缓存函数执行结果的方法,步骤4中,当业务逻辑处理函数的处理结果为有效数据类型的返回值时,才对函数执行结果进行缓存;所述有效数据类型是指Java语言中的除void和Void类型之外的数据类型。
再进一步,如上所述的一种基于AOP技术缓存函数执行结果的方法,所述更新目标数据的函数包括追加函数、修改函数或删除函数。
更进一步,如上所述的一种基于AOP技术缓存函数执行结果的方法,在对业务逻辑处理函数的函数执行结果进行缓存或者对更新目标数据的函数清除缓存数据时,需要在Spring配置文件中将此函数的函数名设置为切入点,并在切入点进行函数执行结果的缓存或者缓存数据的清除。
一种基于AOP技术缓存函数执行结果的系统,包括:
特征码生成装置:用于生成所调用的业务逻辑处理函数的唯一的函数实例特征码;
数据缓存装置:用于保存函数执行结果;
缓存处理通知装置:用于在数据缓存装置中检索是否存在实例特征码所对应的函数执行结果;若是则从数据缓存装置获得该实例特征码对应的执行结果并返回给调用方;若否则执行业务逻辑处理函数,将函数执行结果保存到数据缓存装置中,并将函数执行结果返回给调用方;
缓存清除通知装置:用于在业务逻辑处理函数为更新目标数据的函数时,清除数据缓存装置中该函数所在类对应的缓存数据。
进一步,如上所述的一种基于AOP技术缓存函数执行结果的系统,所述函数实例特征码是根据所调用的业务逻辑处理函数的函数实例的类名、函数名及参数信息生成的,以类名开头的唯一的函数实例特征码。
再进一步,如上所述的一种基于AOP技术缓存函数执行结果的系统,对缓存处理通知装置或缓存清除通知装置,需要在Spring配置文件中将要调用的业务逻辑处理函数的函数名设置为切入点,并在此切入点执行数据的缓存或清除。
更进一步,如上所述的一种基于AOP技术缓存函数执行结果的系统,在缓存处理通知装置进行数据的检索是以实例特征码为依据进行的,在缓存时是以实例特征码为主键将函数执行结果保存到数据缓存装置中的。
本发明的效果在于:
1.模块解耦:采用本发明,缓存处理功能模块和业务逻辑功能模块完全独立,通过Spring配置文件的修改即可将缓存处理功能模块应用到业务逻辑功能模块中,也可以在Spring配置文件中设置对哪些对象、对象的哪些成员函数的执行结果进行缓存。
2.实现细粒度数据的缓存:以函数名和函数参数值为基础进行缓存,做到了细粒度数据的缓存,避免了现有技术只能对粗粒度数据进行缓存的弊端。
3.随需缓存:不同于现有缓存技术一次性将所有系统数据加载到缓存中占用计算机内存资源的落后方法,本发明提供随需缓存技术,函数在未被执行时不会缓存任何数据,在被执行时才将满足参数要求的执行结果缓存在计算机内存中。
具体实施方式
本发明提供了一种基于AOP技术缓存函数执行结果的方法及系统,通过该方法及系统能够实现企业应用系统数据细粒度的缓存、通过该技术的应用,可以大幅度的提高系统运行性能,使得业务系统使用的人越多,被缓存的数据就越多,系统运行地越快。
下面结合说明书附图与具体实施方式对本发明做进一步的详细说明。
图1示出了本发明具体实施方式中提供的一种基于AOP技术缓存函数执行结果的系统的结构框图,由图中可以看出该系统主要包括数据缓存装置12、缓存处理通知装置13、缓存清除通知装置14和特征码生成装置11;其中:
特征码生成装置11:用于生成所调用的业务逻辑处理函数的唯一的函数实例特征码;
数据缓存装置12:用于保存函数执行结果;缓存处理通知装置13和缓存清除通知14共用相同的数据缓存装置12;
缓存处理通知装置13:用于在数据缓存装置12中检索是否存在实例特征码所对应的函数执行结果;若是,则在数据缓存装置获得该实例特征码对应的执行结果并返回给调用方;若否,则执行业务逻辑处理函数,将函数执行结果保存到数据缓存装置中,并将函数执行结果返回给调用方;缓存处理通知装置13的具体工作流程如图3所示;
其中,缓存处理通知装置13进行数据的检索是以实例特征码为依据进行的,在缓存时是以实例特征码为主键将函数执行结果保存到数据缓存装置12中的。
缓存清除通知装置14:用于在业务逻辑处理函数为更新目标数据的函数时,清除数据缓存装置中该函数所在类对应的缓存数据。
由于本发明中的业务逻辑处理函数是面向对象开发语言Java语言的对象成员函数,对缓存处理通知装置和缓存清除通知装置,需要在Spring配置文件中将要调用的业务逻辑处理函数的函数名设置为切入点,并在此切入点执行数据的缓存或清除。在AOP编程中,需要在配置文件中为程序设置切入点(Pointcut),程序执行到切入点后,会调用在这个切入点上设置的通知,通知是外部的程序代码,如本发明的缓存处理通知和缓存清除通知。
图2示出了基于图1中一种基于AOP技术实现函数执行结果缓存的系统的基于AOP技术实现函数执行结果缓存的方法的流程图,由图中可以看出,该方法主要包括以下步骤:
步骤S21、调用业务逻辑处理函数,生成实例特征码;
调用业务逻辑处理函数,并由特征码生成装置11生成该业务逻辑处理函数的唯一的实例特征码。
函数调用实际上就是函数原型实例化的过程,将一次函数调用称为函数实例化,函数实例以类名、函数名及传入的参数列表区分其唯一性。特征码生成装置11根据函数实例的类名、函数名及参数列表信息生成一个唯一的函数实例特征码。由于函数的实例特征码都是唯一的,所以在数据缓存装置12中检索函数执行结果是以函数的实例特征码为依据进行的,在缓存时是以实例特征码为主键将函数执行结果存入到数据缓存装置的。在操作过程中,就可以通过该特征码查询其对应的函数执行结果。
其中,本发明的业务逻辑处理函数为面向对象开发语言Java语言的对象成员函数。参数列表中的参数是Java语言的基本数据类型、数组或对象类型。在实际的操作过程中,函数可以不带参数,或者带一个或者多个参数。
步骤S22、根据实例特征码检索函数执行结果;
根据业务逻辑处理函数的实例特征码,在数据缓存装置12中检索是否存在该函数的函数执行结果,若是则进入步骤S23,若否则进入步骤S24。由步骤S21中可知,每一个业务逻辑处理函数都有其唯一的实例特征码,根据该实例特征码,用户可以在数据缓存装置中查找是否存在该实例特征码所对应的函数的执行结果。
步骤S23、获取函数执行结果;
如果在此次调用执行步骤S21中的业务逻辑处理函数之前,已经执行过相同的函数实例,此次调用则不需要再执行相应的业务逻辑处理函数,在步骤S22中就可以通过在数据缓存装置12中检索得到实例特征码所对应的函数的执行结果,进入步骤S25。
步骤S24、执行业务逻辑处理函数,获取并保存函数执行结果;
如果在此次调用执行步骤S21中的业务逻辑处理函数之前,没有执行过相同的函数实例,就需要执行所述业务逻辑处理函数,并将得到的函数执行结果缓存到数据缓存装置12中,在下次执行该函数实例时,就可以根据唯一的实例特征码直接在数据缓存装置12中检索得到其函数执行结果。
其中,在对业务逻辑处理函数的函数执行结果进行缓存时,需要在Spring配置文件中将函数的函数名设置为切入点,并在此切入点进行函数执行结果的缓存。此外,业务逻辑函数的处理结果必须为有效数据类型(除void类型和Void之外的数据类型,例如java语言基本类型int型、float型等,或者对象类型String类型等)的返回值时,才对函数执行结果进行缓存。
步骤S25、将函数执行结果返回给业务逻辑处理函数的调用方。
将步骤S23或者步骤S24中得到的函数执行结果返回给调用方。
对于本发明的上述方法,如果步骤S21中业务系统调用了更新目标数据的业务逻辑处理函数时,如追加、修改或删除等函数时,将导致缓存的目标数据出现变化,数据缓存装置12中的数据将失效,此时,缓存清除通知装置就会清空数据缓存中相应类对应的缓存数据,其中清除缓存数据的具体步骤如图4所示:
1)调用修改目标数据的业务逻辑处理函数;
2)执行所调用的更新目标数据的业务逻辑处理函数,并获取被执行函数所在类名;
3)获取数据缓存装置的函数实例特征码列表,将实例特征码列表中的每个函数实例特征码与步骤2)被执行函数所在类名进行对比,并删除数据缓存装置中以被执行函数所在类名开头的实例特征码所对应的缓存数据。
同样的,在对更新目标数据的函数清除数据时,需要在Spring配置文件中将此函数的函数名设置为切入点,并在此切入点执行数据的清除。
下面结合具体的实施例对本发明进行进一步详细的说明。
本实施例采用Java语言提供的HashMap作为数据缓存装置,在Spring配置文件中定义HashMap的配置如下:
<bean id=″cacheMap″class=″java.util.HashMap″/>
本发明实施例提供的缓存处理通知装置(Advice)为Spring AOP的Interception Around通知,实现该通知需要做以下操作:
1.实现Spring的MethodInterceptor接口,本实施例将缓存处理通知装置命名为CacheInterceptor。
2.在Spring配置文件中定义缓存处理通知装置的配置如下:
上面的配置缓存处理通知装置cacheInterceptor引用了前面定义的cacheMap数据缓存装置,将会把数据缓存在cacheMap中。
3.在Spring配置文件中通过RegexpMethodPointcutAdvisor将缓存处理通知装置配置进切入点:
上面配置的cacheAdviser表示cacheInterceptor将拦截对象成员函数名中含“find”和“get”的函数。
本发明实施例提供的缓存清除通知装置(Advice)为Spring AOP的AfterReturning通知,实现该通知需要做以下操作:
1.实现Spring的AfterReturningAdvice接口,本实施例将缓存清除通知装置命名为CacheClearAdvice。
2.在Spring配置文件中定义缓存清除通知装置的配置如下:
上面配置的缓存清除通知装置cacheClearAdvice引用了前面定义的cacheMap数据缓存装置,将会把cacheMap中相应类缓存的数据清除。
3.在Spring配置文件中通过RegexpMethodPointcutAdvisor将缓存清除通知装置配置进切入点:
上面配置的clearAdviser表示cacheClearAdvice将拦截对象成员函数名中含“add”、“update”和“delete”的函数。
下面通过Spring配置文件对业务逻辑模块StudentDao的函数实现缓存功能,StudentDao有下面三个成员函数:
public List getStudentList();
public Student getStudent(String name);
public void deleteStudent(String name);
在Spring配置文件中追加StudentDao的配置,如下:
<bean id=″studentDao″class=″StudentDao″/>
在Spring配置文件中通过自动代理,将缓存处理cacheAdviser和缓存清除clearAdviser应用到上面的studentDao对象,配置如下:
在进行上述配置后,在执行StudentDao的getStudentList()函数时会先通过缓存处理通知装置从数据缓存装置查询执行结果,如果存在则直接将结果返回给函数调用方,无需实际执行getStudentList()函数;如果不存在则执行getStudentList()函数,并将执行结果缓存在数据缓存装置中,在调用deleteStudent()删除一个学生后,学生列表出现变化,缓存失效,缓存清除装置将会清除数据缓存装置中StudentDao类对应的数据。
实施例1
第一次调用StudentDao的getStudentList()成员函数的执行过程:
步骤1、StudentDao类的getStudentList()成员函数被调用;
步骤2、缓存处理通知装置拦截被调用的业务逻辑处理函数getStudentList(),并获取该函数所在类名“StudentDao”、函数名“getStudentList”,本实施例不带参数,函数实例特征码生成装置将函数名“getStudentList”作为函数实例字符串,通过散列函数得到所述函数实例字符串的散列码“1713854531”,将类名“StudentDao”和散列码“1713854531”组合得到函数实例特征码“StudentDao1713854531”;
步骤3、根据所述函数实例特征码“StudentDao1713854531”在数据缓存装置cacheMap中查询函数执行结果,由于函数第一次被执行,因此无法检索到执行结果;
步骤4、执行业务逻辑函数getStudentList()函数,从数据库读取数据;
步骤5、以所述函数实例特征码“StudentDao1713854531”为主键将函数执行结果存入数据缓存装置cacheMap;
步骤6、将执行结果返回给函数调用方。
第二次及第二次以上调用函数执行过程:
步骤1、StudentDao类的getStudentList()成员函数被调用;
步骤2、缓存处理通知装置拦截被调用的业务逻辑处理函数getStudentList(),并获取所在类名“StudentDao”、函数名“getStudentList”,本实施例不带参数,函数实例特征码生成装置将函数名“getStudentList”作为函数实例字符串,通过散列函数得到所述函数实例字符串的散列码“1713854531”,将类名“StudentDao”和散列码“1713854531”组合得到函数实例特征码“StudentDao1713854531”;
步骤3、根据所述函数实例特征码“StudentDao1713854531”在数据缓存装置cacheMap中查询函数执行结果,由于函数已经被执行一次,因此可以在缓存中检索到第一次执行结果;
步骤4、从数据缓存装置中获取缓存的函数执行结果;
步骤5、将步骤4得到的函数执行结果返回给函数调用方。
采用上述的一种基于AOP技术缓存函数执行结果的方法,在完成第一次函数执行后,进行第二次及第二次以上的函数调用就不会实际执行getStudentList函数去数据库读取数据而是直接从数据缓存装置获取数据,由于从内存读取比数据库磁盘读取性能更高,通过缓存机制显著提高了函数执行效率。
实施例2
本发明实施例提供了带一个参数的函数的缓存机制。
第一次调用函数执行过程:
步骤1、StudentDao类的getStudent(“tom”)成员函数被调用;
步骤2、缓存处理通知装置拦截被调用的业务逻辑处理函数getStudent(),并获取所在类名“StudentDao”、函数名“getStudent”以及参数“Tom”,函数实例特征码生成装置将函数名“getStudent”和参数“Tom”组合得到函数实例字符串“getStudentTom”,通过散列函数得到所述函数实例字符串的散列码“-1330179827”,将类名“StudentDao”和散列码“-1330179827”组合得到函数实例特征码“StudentDao-1330179827”;
步骤3、根据所述函数实例特征码“StudentDao-1330179827”在数据缓存装置cacheMap中查询函数执行结果,由于函数第一次被执行,因此无法检索到执行结果;
步骤4、执行getStudent(“tom”)函数,从数据库读取“Tom”的相关信息,返回Student对象;
步骤5、以所述函数实例特征码“StudentDao-1330179827”为主键将函数执行结果存入数据缓存装置cacheMap;
步骤6、将执行结果返回给函数调用方。
第二次及第二次以上调用函数执行过程:
步骤1、StudentDao类的getStudent(“tom”)成员函数被调用;
步骤2、缓存处理通知装置拦截被调用的业务逻辑处理函数getStudent(),并获取所在类名“StudentDao”、函数名“getStudent”以及参数“Tom”,函数实例特征码生成装置将函数名“getStudent”和参数“Tom”组合得到函数实例字符串“getStudentTom”,通过散列函数得到所述函数实例字符串的散列码“-1330179827”,将类名“StudentDao”和散列码“-1330179827”组合得到函数实例特征码“StudentDao-1330179827”;
步骤3、根据所述函数实例特征码“StudentDao-1330179827”在数据缓存装置cacheMap中查询函数执行结果,由于函数已经被执行一次,因此可以在缓存中检索到第一次执行结果;
步骤4、从数据缓存装置中获取缓存的函数执行结果;
步骤5、将步骤4得到的函数执行结果返回给函数调用方。
实施例3
本发明实施例提供了业务逻辑删除方法使缓存数据失效的机制。
步骤1、业务逻辑删除方法deleteStudent(“Tom”)被调用,由于“Tom”被删除,这导致getStudentList()和getStudent(“Tom”)函数的执行结果出现变化,缓存中的数据将失效;
步骤2、Spring AOP执行完删除目标数据的方法后,将执行缓存清除通知装置,缓存清除通知装置获取被执行函数所在类名“StudentDao”;
步骤3、缓存清除通知装置清除数据缓存装置cacheMap键名以“StudentDao”开头的数据。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其同等技术的范围之内,则本发明也意图包含这些改动和变型在内。