简介
通常在系统开发中,必不可少的要使用到缓存(Cache),如用户信息、字典信息都会使用缓存来提高性能;但是如何使用好缓存是个需要深入研究的话题,缓存方案没有通用性,针对不同的应用层面,缓存的设计通常也是千差万别的!这里只是介绍了一种比较轻量级、无侵入的缓存方案,该方案基于Spring+SpringModules。
目的
- 方法级别的缓存
- 声明式、无侵入
- 不绑定缓存框架
- JDK 1.4/1.5均适用
实现
基于JDK1.4
JDK1.4中可使用方法映射、元数据(commons-attributes)两种方式声明需要缓存的方法。由于元数据需要导入额外的包,今后JDK升级后无法转换为annotation,且commons-attributes包本身有点BUG,故不在本文讨论之中。
定义缓存实现
目前支持的实现有:
-
org.springmodules.cache.provider.jboss.JbossCacheManagerFactoryBean
-
org.springmodules.cache.provider.jcs.JcsManagerFactoryBean
-
org.springmodules.cache.provider.oscache.OsCacheManagerFactoryBean
-
org.springframework.cache.ehcache.EhCacheManagerFactoryBean
<!-- 缓存实现管理器 -->
<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
</bean>
定义缓存接口
<!-- 缓存统一接口 -->
<bean id="cacheProviderFacade"
class="org.springmodules.cache.provider.ehcache.EhCacheFacade">
<property name="cacheManager" ref="cacheManager" />
</bean>
定义缓存拦截器
<bean id="cachingInterceptor"
class="org.springmodules.cache.interceptor.caching.MethodMapCachingInterceptor">
<property name="cacheProviderFacade" ref="cacheProviderFacade" />
<property name="cachingModels">
<props>
<prop key="com.cidp.system.service.IDictService.load*">cacheName=dictCache</prop>
</props>
</property>
</bean>
定义刷新拦截器
<bean id="flushingInterceptor"
class="org.springmodules.cache.interceptor.flush.MethodMapFlushingInterceptor">
<property name="cacheProviderFacade" ref="cacheProviderFacade" />
<property name="flushingModels">
<props>
<prop key="com.cidp.system.service.IDictService.update*">cacheNames=dictCache</prop>
</props>
</property>
</bean>
为业务层添加缓存拦截器
<!-- 注册自动代理创建,为业务Bean添加事务拦截器 -->
<bean id="ServiceAutoProxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="proxyTargetClass" value="false"></property>
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>cachingInterceptor</value>
<value>flushingInterceptor</value>
</list>
</property>
</bean>
基于JDK1.5
JDK 1.5中出现了annotation这样的好东西,使得我们可以在方法级别上做更精细的控制,将基于XML配置转入源代码中。
注:缓存实现和缓存接口配置同上,拦截器绑定同上
定义缓存拦截器
<bean id="cachingAttributeSource"
class="org.springmodules.cache.annotations.AnnotationCachingAttributeSource">
</bean>
<bean id="cachingInterceptor"
class="org.springmodules.cache.interceptor.caching.MetadataCachingInterceptor">
<property name="cacheProviderFacade" ref="cacheProviderFacade" />
<property name="cachingAttributeSource" ref="cachingAttributeSource" />
<property name="cachingModels">
<props>
<prop key="dictCaching">cacheName=dictCache</prop>
</props>
</property>
</bean>
定义刷新拦截器
<bean id="flushingAttributeSource"
class="org.springmodules.cache.annotations.AnnotationFlushingAttributeSource">
</bean>
<bean id="flushingInterceptor"
class="org.springmodules.cache.interceptor.flush.MetadataCachingInterceptor">
<property name="cacheProviderFacade" ref="cacheProviderFacade" />
<property name="flushingAttributeSource" ref="flushingAttributeSource" />
<property name="flushingModels">
<props>
<prop key="dictFlushing">cacheNames=dictCache</prop>
</props>
</property>
</bean>
Java代码
@Cacheable(modelId = "dictCaching")
public Dict load(Long id);
@CacheFlush(modelId = "dictFlushing")
public void update(Dict dict);
ehcache
springmodules支持<ehcache>标签形式的配置方式,可简化以上用<bean>定义拦截器的方式。如果项目中使用的缓存框架为ehcache,可通过该标签简化配置
分享到:
相关推荐
本文将深入探讨两种常见的缓存方案——ASimpleCache和SharedPreferences,并结合实际应用来解析它们的工作原理、优缺点以及如何在Android开发中有效地使用它们。 ASimpleCache是由知名Android开发者Jake Wharton...
"Android 客户端缓存方案设计" Android 客户端缓存方案是一种重要的优化技术,在 Android 应用开发中扮演着至关重要的角色。它不仅可以为用户节省 3G 流量,同时也可以提高用户体验。这篇文章将详细介绍 Android ...
Dubbo 和 Zookeeper 结合使用的缓存方案是分布式系统中常见的设计,主要目的是解决多节点环境下数据一致性的问题,确保在各个节点之间的缓存能够实时同步更新。以下将详细阐述这个方案的具体实现、工作原理以及其...
读书笔记:缓存方案基于社区电商场景的Redis缓存架构实战
综上所述,本文提出的基于FPGA的DDR3高速图像缓存策略,不仅可以实现图像处理领域对于高速数据缓存的需求,而且通过高效利用DDR3内存的高带宽特性,显著提高了图像数据处理的速度和效率。这项技术的发展与应用,为...
本文介绍了一种针对分布式网络存储环境的编码缓存方案,该方案基于均衡数据放置策略,旨在确保负载平衡,并在节点或磁盘故障时防止数据损失。文章详细描述了如何将Maddah方案和干扰消除方案扩展到多服务器系统,并将...
基于文件缓存价值量感知的网络边缘缓存策略之计算机研究 本文研究基于文件缓存价值量感知的网络边缘缓存策略,这是一种智能化的缓存策略,旨在提高网络边缘缓存的性能和效率。该策略通过对文件缓存价值量的感知和...
"Android-一个基于xml格式数据保存的本地缓存方案"是一种针对Android平台设计的缓存策略,旨在存储和检索数据,尤其是对象和列表,而无需过度依赖SQLite数据库。这种解决方案的主要优点是它灵活且轻量级,适合那些不...
这篇文章深入探讨了基于Flash存储器的缓存换入换出策略的算法改进。首先,文章明确指出传统的操作系统大多基于传统的磁盘存储器进行设计,缓存换出算法主要以提高命中率为主要目标。然而,随着Flash存储器在移动...
### 基于公交车缓存的车联网位置隐私保护方案 #### 一、引言与背景 随着物联网(IoT)技术的发展,车联网(IoV)作为5G网络的关键应用场景之一,已经成为研究热点。车联网不仅涉及车辆间的直接通信,还包含了车辆...
这时,我们可以采用基于Redis的Shiro缓存解决方案来提升系统的可扩展性和性能。 标题“基于Redis的shiro集中式缓存解决方案实现”所指的知识点主要包括以下几个部分: 1. **Redis**:Redis是一个开源的、基于键值...
为了克服上述问题,提出了基于数据缓存的影像数据库设计方案,该方案旨在提高数据获取效率的同时降低对系统配置和网络带宽的要求。 ##### 3.1 体系结构设计 该体系结构主要包括客户端、数据服务器和数据缓存三个...