`
hyj_dx
  • 浏览: 102026 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring中cache服务的实现(一)

阅读更多

cache服务的实现(在spring中)

 

扩展Spring:实现Cache服务- -

                                      

 

 

TargetSource的概念

       Spring Framework引入了TargetSource的概念,使用org.springframework.aop.TargetSource接口来表示。它负责返回实现了JointPoint的"target object"。当AOP proxy处理一个方法调用时,TargetSource的实现返回target对象的实例。

       使用Spring AOP的开发人员通常并不需要直接和TargetSource打交道,但TargetSource提供了支持pooling,hot swappable等高级特性。例如,pooling TargetSource使用一个pool管理对象实例,为每次调用返回不同的target实例。

       如果你不指定TargetSource,Spring AOP将使用一个缺省的实现来包装对象,并且每次调用都会返回同一个对象实例。

 

我的目标

       Spring Framework使用TargetSource的概念实现了pooling的功能,其中使用了Jakarta的Commons Pool。通过编写配置文件声明,Spring可以pooling任何一个POJO对象。我的目标是模仿pooling的实现方式,实现一个简单的缓存机制。用于探索Spring AOP的实现方式,以便扩展目前Spring Framework没有实现的功能。

 

选择对象缓存类库

       目前,开源的对象缓存类库有很多,如Jakarta Commons Cache,OSCache,Java Caching System和Java Object Cache等。其中OSCache的比较成熟,应用较广(如Hibernate,iBatis等),功能也很强大(支持Cluster)。因此,我选择了OSCache作为实现Cache TargetSource的类库。

 

准备测试用例

       考虑一下这样的应用情景,我的应用需要一个管理数据的对象,该对象每隔一定的时间从数据库中读取数据,并缓存在内存中。在缓存期间,如果客户程序读取数据,该数据对象将返回内存中的数据,如果数据超过指定的缓存时间,则重新从数据库中读取并更新数据。

       首先,我模仿CommonsPoolTargetSource编写了以下的testcache.xml配置文件:

 

<beans>

     <bean id="businessObjectTarget" class="unittest.MyBusinessObject" singleton="false"/>

     <bean id="cacheTargetSource" class="unittest.OSCacheTargetSource">

         <property name="target"><ref local="businessObjectTarget"/></property>

         <property name="refreshPeriod"><value>10</value></property>

     </bean>

     <bean id="businessObject" class="org.springframework.aop.framework.ProxyFactoryBean">

         <property name="proxyInterfaces"><value>unittest.Business</value></property>

         <property name="targetSource"><ref local="cacheTargetSource"/></property>

     </bean>

</beans>

 

        然后,编写测试用例CacheTargetSourceTest:

 

public class CacheTargetSourceTest extends TestCase {

      ApplicationContext ctx = null;

      BizManager manager;

 

      protected void setUp() throws Exception {

          super.setUp();

          ctx = new FileSystemXmlApplicationContext("testcache.xml");

          manager = new BizManager(200);

          manager.start();

      }

 

     public void testGetId() throws Exception {

         for (int i=0; i<6; i++) {

              Thread.sleep(2000);

              Business biz = (Business)ctx.getBean("businessObject");

              assertNotNull(biz);

              System.out.println("get id from BizObjec=" + biz.getId());

         }

     }

}

 

       接下来,编写业务测试代码Business,MyBusinessObject:

public interface Business {

      public int getId();

}

 

public class MyBusinessObject implements Business {

     final Log logger = LogFactory.getLog(this.getClass());

     private int id = 0;

 

     public MyBusinessObject() {

          logger.debug("create new MyBusnissObject");

          id = BizManager.getId();

     }

 

     public int getId() {

          return id;

     }

}

 

     其中MyBusinessObject通过一个BizManager线程类来更新数据库,模拟数据库中的数据更新。

 

public class BizManager extends Thread {

      private int period = 1000;

      private static int id = 0;

 

      public BizManager(int l) {

          this.period = l;

      }

 

      public void run() {

          System.out.println("BizManager started.");

          try {

              while (true) {

                  sleep(period);

                  id++;

              }

         } catch(Exception ex) {}

      }

      public static int getId() {

           return id;

      }

}

 

       最后,实现一个简单OSCacheTargetSource类。我在这里试探性地实现了TargetSource接口,并通过setRefreshPeriod方法指定了更新数据的时间间隔。在这里有一些地方需要说明。为了能让FactoryBean生成新的TargetSource实例,TargetSource的isStatic方法返回false;在releaseTarget方法中调用CacheAdministrator的destroy方法;每次更新内存的数据时,都生成新的数据管理对象,以调用构造器中读取更新数据的方法,这种做法当然很不优雅,留待以后重构。代码如下:

 

public class OSCacheTargetSource implements TargetSource {

       private int refreshPeriod = 2000;

       private Object target;

       private final static String MY_KEY = "mykey";

       private GeneralCacheAdministrator admin;

       private final Log logger = LogFactory.getLog(OSCacheTargetSource.class);

 

       public OSCacheTargetSource() {

             admin = new GeneralCacheAdministrator();

       }

 

       public boolean isStatic() {

             return false;

       }

 

       public void setTarget(Object obj) {

             this.target = obj;

       }

 

       public void releaseTarget(Object target) throws Exception {

            admin.destroy();

       }

 

       public int getRefreshPeriod() {

            return refreshPeriod;

       }

 

       public void setRefreshPeriod(int i) {

            refreshPeriod = i;

       }

 

       private Object getCached() {

           try {

                 //CacheEntry.INDEFINITE_EXPIRY = -1

                 target = (Object) admin.getFromCache(MY_KEY, refreshPeriod);

           } catch (NeedsRefreshException nre) {

                 try {

                       target = target.getClass().newInstance();

                       admin.putInCache(MY_KEY, target);

                 } catch (Exception ex) {

                      target = nre.getCacheContent();

                      admin.cancelUpdate(MY_KEY);

                 }

          }

          return target;

      }

 

      public Object getTarget() throws Exception {

            return getCached();

      }

 

分享到:
评论

相关推荐

    spring-cache.xsd+spring-encache.xsd

    描述中提到的"springmodules-ehcache.xsd"和"springmodules-cache.xsd"可能来自于Spring Modules项目,这是一个早期的扩展Spring功能的库,其中包含了对Ehcache的支持。这两个文件定义了XML元素和属性,使得开发者...

    spring-cache(通过key值更新缓存)

    Spring Cache是一个抽象层,它允许开发者在不关注具体缓存实现的情况下,轻松地在应用程序中添加缓存功能。本篇文章将详细探讨如何通过key值更新Spring Cache中的指定缓存,以及相关的缓存管理策略。 首先,让我们...

    Spring来实现一个Cache简单的解决方案

    本文将详细介绍如何利用Spring框架结合ehCache实现一个简单的缓存解决方案。 #### 二、Spring缓存管理 Spring框架提供了多种方式来管理和操作缓存,包括基于注解的缓存管理、基于XML配置的缓存管理等。本文将重点...

    SpringCache与redis集成,优雅的缓存解决方案.docx

    SpringCache是一个基于AOP(Aspect-Oriented Programming)的缓存解决方案,可以自动地为我们实现缓存功能,从而减少了编写模板代码的工作量。 使用SpringCache,我们可以轻松地将缓存功能添加到我们的应用程序中。...

    spring-cache-mongodb:基于MongoDB的Spring Cache实现

    Spring Cache是Spring框架提供的一种抽象层,允许开发者轻松地在应用程序中引入缓存机制,而无需关心具体的缓存实现。本项目"spring-cache-mongodb"正是一个针对Spring Cache的实现,它利用MongoDB作为底层的存储...

    springboot 使用spring cache缓存 和 使用fastjson配置redis系列化

    在Spring Boot应用中,Spring Cache是一个强大的工具,用于在应用程序中实现缓存抽象,它可以减少对数据库或远程服务的重复调用,从而提高性能。在本篇文档中,我们将探讨如何使用Spring Cache来缓存数据,并结合...

    springcache+redis springboot maven

    在`demo_cache2_springcache_redis_mybatis_maven_springboot_lombok`这个项目中,除了上述的Spring Cache和Redis的整合,还可能包含了MyBatis的集成,MyBatis是一个持久层框架,用于处理SQL语句。Lombok是一个代码...

    SSM与memcached整合项目Spring Cache

    在本项目中,我们主要探讨的是如何将Spring Cache与memcached...通过这样的整合,我们可以充分利用Spring Cache的便捷性和memcached的高性能,为应用程序构建一个强大的缓存层,有效提升服务的响应速度和并发处理能力。

    (SSM框架)memcached整合Spring基于Cache注解.

    在SSM框架中引入Memcached并基于Spring的Cache注解进行整合,可以实现高效、分布式的数据缓存,提升系统性能。下面将详细阐述这一过程中的关键知识点。 1. **Memcached介绍**: Memcached是一款高性能、分布式的...

    扩展spring boot cache实现redis一二级分布式缓存

    为了实现一级缓存,可以在服务层添加一个本地缓存,如使用`@Cacheable`注解的方法前先检查本地缓存。如果本地缓存存在,则直接返回,否则查询远程Redis并存入本地缓存。 二级缓存的实现则是在一级缓存失效后,自动...

    Redis整合SpringCache实例

    **Redis整合SpringCache实例** 在现代的Web应用中,数据缓存是提高系统性能的关键技术之一。本示例主要探讨如何将开源的内存数据结构存储系统Redis与Spring Cache框架结合,实现高效的分布式缓存解决方案。Redis以...

    jar包-spring-modules-cache.jar

    而Spring Modules Cache是Spring框架的一个扩展,它提供了一种统一的缓存管理机制,使得开发者能够方便地在Spring应用中集成各种缓存解决方案,如 EhCache、JCS、GemFire等。本文将深入探讨Spring Modules Cache在...

    springCache

    Spring Cache 是 Spring 框架的一个重要组成部分,它提供了一种在应用程序中统一管理缓存的能力,无需依赖特定的缓存实现,如 Ehcache、Redis 或 Hibernate 二级缓存等。通过 Spring Cache,开发者可以方便地在方法...

    spring-cache-4.2.xsd.zip

    标题中的"spring-cache-4.2.xsd.zip"是一个压缩包文件,主要包含了Spring框架缓存模块的相关XML Schema定义文件。...通过合理配置,开发者可以利用Spring Cache实现高效且灵活的缓存管理,优化应用程序的性能。

    Spring cache

    Spring Cache 是 Spring 3.1 版本引入的一项重要特性,它不是一种具体的缓存实现(如 EHCache 或 OSCache),而是一种缓存使用的抽象层。通过在现有的业务代码上添加特定的注解,可以轻松地为方法调用添加缓存支持。...

    spring cache + redis 主从

    此外,还需要掌握如何将Spring Cache与Redis整合,以便在应用中高效使用缓存机制。 一、Redis的主从配置 1. 准备工作: - 操作系统要求:Ubuntu 16.04。 - Redis版本:选择适合的稳定版本,例如redis-4.0.9.tar....

    redis-cluster和spring集成,基于cache注解

    Spring 是一个广泛使用的 Java 应用框架,提供了一系列的开发工具和服务,包括依赖注入、面向切面编程以及数据访问等。在企业级应用中,Spring 提供的缓存抽象使得集成各种缓存系统变得简单,其中包括 Redis。 集成...

    spring boot+spring cache实现两级缓存(redis+caffeine)

    在Spring Boot+Spring Cache实现两级缓存(Redis+Caffeine)中,Redis作为远程缓存,Caffeine作为应用内缓存。当应用内缓存有符合条件的数据时,就可以直接使用,而不用通过网络到Redis中去获取,这样就形成了两级...

    使用springCache实现缓存

    使用springCache实现缓存

Global site tag (gtag.js) - Google Analytics