BDF2默认使用的是ehcache实现的缓存功能,对于我们的应用来说,同样可以使用BDF2提供的缓存功能来缓存需要业务数据,从而降低访问数据频率,减轻数据库服务器压力。要在业务当中使用BDF2中的缓存工具类,我们只需要获取BDF2当中提供的ApplicationCache接口的实现类实例就行,因为这个接口默认配置在Spring当中,所以如果您的业务类也配置在Spring当中,那么只需要注入ApplicationCache接口实现类的bean即可,ApplicationCache接口实现类的bean id为“bdf2.applicationCache”;如果需要在一个非Spring bean的业务类中获取这个接口实现类的bean,可以通过下面的代码实现:
ApplicationCache applicationCache=ContextHolder.getBean(ApplicationCache.BEAN_ID);
ApplicationCache接口源码如下:
package com.bstek.bdf2.core.cache; /** * @author Jacky.gao * @since 2013-5-21 */ public interface ApplicationCache { public static final String BEAN_ID = "bdf2.applicationCache"; /** * 根据指定的key,从缓存当中获取一个对象 * @param key 缓存当中对象的key值 * @return 返回缓存当中与给定key对应的对象值,如果对象不存在,就返回null */ Object getCacheObject(String key); /** * 从临时缓存当中获取一个被临时缓存对象,<br> * 默认情况下,位于临时缓存中对象生命周期为1800秒,也就是半小时 * @param key 缓存当中对象的key值 * @return 返回缓存当中与给定key对应的对象值,如果对象不存在,就返回null */ Object getTemporaryCacheObject(String key); /** * 将一个对象放入缓存当中,同时如果缓存当中有存在相同key的对象,则进行覆盖 * @param key 对象的key * @param obj 具体对象 */ void putCacheObject(String key, Object obj); /** * 将一个对象放入临时缓存当中,同时如果缓存当中有存在相同key的对象,则进行覆盖,<br> * 默认情况下,位于临时缓存中对象生命周期为1800秒,也就是半小时 * @param key 对象的key * @param obj 具体对象 */ void putTemporaryCacheObject(String key, Object obj); /** * 从缓存当中移除一个对象 * @param key 要移除的对象的key值 */ void removeCacheObject(String key); /** * 从临时缓存当中移除一个对象 * @param key 要移除的对象的key值 */ void removeTemporaryCacheObject(String key); }
接口方法都有注释,且比较简单,这里就不再进一步介绍了。
集群环境下本地缓存同步方案
当BDF2项目部署到集群环境下,集群环境中某个节点缓存数据发生变化时,需要实时同步其他节点的缓存数据,那么我们可以使用BDF2提供的本地缓存同步方案,使用此方案就可以不用再单独配置缓存服务器,只需要配置几个简单的参数就可以完成缓存同步,比采用缓存服务器更加方便、高效。
具体的实现原理是,当用户手工刷新某一节点缓存操作时,系统采用Spring的Aop功能对用户手工刷新缓存的方法进行拦截(具体的业务方法调用拦截可参考业务方法调用拦截中相关介绍),然后采用HTTP REST通信方式调用其他节点对外提供的刷新缓存请求。
此功能提供可配置的参数如下表所示:
属性名 | 类型 | 默认值 | 描述 |
---|---|---|---|
bdf2.cache.appList | String | 空 | 用于指定集群环境下需要同步缓存的节点清单,每个节点中间用逗号分隔,每个节点参数由协议、IP地址、端口号和应用上下文组成,例如,bdf2.cache.appList=http://192.168.18.168:8080/bdf2-test,http://192.168.18.168:8082/bdf2-test,当刷新某一个节点的缓存时,会同步刷新在此节点清单中的其他节点缓存。默认此参数为空,表示不启用同步刷新缓存功能。 |
bdf2.cache.refreshMethodInterceptor | String | 空 | 指定用户手动刷新缓存的bean方法,格式由SpringBean的名称加方法名组成,中间用#符号连接,如:testBean#refreshCache,表示在客户端调用testBean的refreshCache方法时,系统会自动同步调用其它节点上的testBean的refreshCache方法。 如果存在多值,那么中间用逗号分隔即可,如:testBean#refreshCache,testBean1#refreshCache1。 在指定bean方法的时候,有一点要注意,那就是这个bean对应的方法一定要是一个没有参数的,比如上面的refreshCache方法,一定是不能有参数的,否则调用时会产生错误。 需要注意的是,对于BDF2中每个模块中内部的刷新缓存操作,比如刷新菜单、权限等都已经默认配置了刷新缓存方法,用户不需再额外配置。 如果您的应用中没有哪个功能使用了bdf2的ApplicationCache接口,那么此参数可以不用管它。否则就需要配置这个参数。 |
如果用户没有配置bdf2.cache.appList属性,那么系统将不会在用户手工刷新缓存操作时刷新其它节点的缓存信息。同时,要使这个功能运转正常,我们还需要正确配置bdf2.globalMethodIntercetporBeanNamesPattern属性值(该属性作用参见业务方法调用拦截功能中相关介绍),保证该属性值中包含*Maintain,否则系统将无法拦截用户手工执行的刷新缓存操作。