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

spring中cache服务的实现(二)

阅读更多

 public Class getTargetClass() {

           try {

                 return this.getTarget().getClass();

           } catch (Exception e) {

                 return null;

           }

      }

}

 

       现在,我们运行测试用例。测试状态条中出现绿条,测试通过。注意,我们在testcache.xml定义的更新数据的间隔是10秒;测试代码每隔2秒读取一次数据;因此我们预计前5次读取的数据是相同的。让我们观察Console窗口中DEBUG信息():

......

BizManager started.

......

27,781 DEBUG unittest.MyBusinessObject - create new MyBusnissObject

......

get id from BizObjec=9

get id from BizObjec=9

get id from BizObjec=9

get id from BizObjec=9

get id from BizObjec=9

37,796 DEBUG unittest.MyBusinessObject - create new MyBusnissObject

get id from BizObjec=59

 

       果然如此,前5次变量id的值都是9,读取第6次数据时,时间已经过12秒,此时变量id的值是59。现在我们将refreshPeriod的值改为5秒,DEBUG信息如下:

BizManager started.

......

get id from BizObjec=9

get id from BizObjec=9

get id from BizObjec=9

03,921 DEBUG unittest.MyBusinessObject - create new MyBusnissObject

get id from BizObjec=39

get id from BizObjec=39

get id from BizObjec=39

 

重构OSCacheTargetSource

       首先定义Cachable接口如下:

 

public interface Cachable {

      public void refresh();

      public void close();

}

 

       然后,让MyBusinessObject实现Cachable接口,refresh方法如下:

public void refresh() {

      logger.debug("refresh MyBusnissObject");

      id = BizManager.getId();

}

 

      接下来,修改OSCacheTargetSource类的getCached方法如下,其中屏蔽的是先前的实现代码:

 

private Object getCached() {

      try {

              //CacheEntry.INDEFINITE_EXPIRY = -1

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

      } catch (NeedsRefreshException nre) {

              try {

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

                    ((Cachable)target).refresh();

                    admin.putInCache(MY_KEY, target);

              } catch (Exception ex) {

                    target = nre.getCacheContent();

                    admin.cancelUpdate(MY_KEY);

              }

       }

       return target;

}

 

       最后,运行测试用例,出现了绿条,测试通过。下面是DEBUG信息输出:

 

BizManager started.

......

47,828 DEBUG base.Cache - No cache entry exists for key='mykey', creating

47,828 DEBUG unittest.MyBusinessObject - refresh MyBusnissObject

......

get id from BizObjec=9

get id from BizObjec=9

get id from BizObjec=9

53,843 DEBUG unittest.MyBusinessObject - refresh MyBusnissObject

get id from BizObjec=39

get id from BizObjec=39

get id from BizObjec=39

 

       我们的方案看来起作用了,但仍然让我们感觉不好,因为需要缓存服务的对象必须要实现Cachable接口,而且OSCacheTargetSource假设需要缓存的对象必须拥有缺省的构造器,这种解决方案太具有侵入性,违反了Spring Framework的设计思想。为了重构代码,OSCacheTargetSource对象必须获得需要缓存的Bean的信息。因此,OSCacheTargetSource对象必须实现BeanFactoryAware或ApplicationContextAware接口。为了证实我们的思路,参考CommonsPoolTargetSource的源代码,发现它确实是实现了BeanFactoryAware接口。

       基于以上的分析,我们把OSCacheTargetSource重构为:

 

public class OSCacheTargetSource implements TargetSource, BeanFactoryAware {

     

      public void setTargetBeanName(String beanName) {

            this.targetBeanName = beanName;

      }

 

      private Object getCached() {

           try {

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

           } catch (NeedsRefreshException nre) {

                 try {

                       target = beanFactory.getBean(this.targetBeanName);

                       admin.putInCache(MY_KEY, target);

                 } catch (Exception ex) {

                       target = nre.getCacheContent();

                       admin.cancelUpdate(MY_KEY);

                 }

           }

           return target;

      }

}

 

       将MyBusinessObject重构为:

 

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;

        }

 

        public void close() {}

}

 

      并修改testcache.xml配置文件如下:

 

<beans>

       <bean id="businessObjectTarget" class="unittest.MyBusinessObject" singleton="false" destroy-method="close"/>

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

             <property name="targetBeanName"><value>businessObjectTarget</value></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>

 

       现在,我们运行测试用例。测试状态条中出现绿条,测试通过。但注意到OSCacheTargetSource类中缓存的对象的key值仍然是写死的,我们需要一个这样的key值,对于BeanFactory或ApplicationContext必须是唯一的。因为每个Bean的id值正好符合这个条件,我们可以使用targetBeanName作为key值。因此OSCacheTargetSource类修改为:

 

private Object getCached() {

      try {

            target = (Object) admin.getFromCache(

            this.targetBeanName, refreshPeriod);

      } catch (NeedsRefreshException nre) {

            try {

                   target = beanFactory.getBean(this.targetBeanName);

                   admin.putInCache(this.targetBeanName, target);

            } catch (Exception ex) {

                   target = nre.getCacheContent();

                   admin.cancelUpdate(this.targetBeanName);

            }

       }

       return target;

}

分享到:
评论

相关推荐

    spring-cache.xsd+spring-encache.xsd

    标题中的"spring-cache.xsd+spring-encache.xsd"提到了两个XML Schema定义文件,它们是Spring框架中用于缓存管理的配置规范。Spring框架是一个广泛应用的Java企业级应用开发框架,它提供了多种功能,包括但不限于...

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

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

    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集成,优雅的缓存解决方案.docx

    在本文中,我们将对SpringCache与Redis集成的优雅缓存解决方案进行详细介绍。 缓存是加速服务响应速度的一种非常有效并且简单的方式。在缓存领域,有很多知名的框架,如EhCache、Guava、HazelCast等。Redis作为key-...

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

    本篇文章将探讨如何扩展Spring Boot的缓存功能,实现基于Redis的一级和二级分布式缓存。Redis是一个高性能的键值存储系统,常用于实现分布式缓存。 一级缓存通常指的是应用程序内部的缓存,如Spring Cache或Guava ...

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

    ### Spring实现Cache简单解决方案 #### 一、背景与概述 在现代软件开发中,缓存是一种常见的优化手段,用于提高应用程序的性能。Spring框架作为Java领域最流行的开发框架之一,为开发者提供了丰富的缓存管理机制。...

    springcache+redis springboot maven

    在这个项目中,"springcache+redis"的整合意味着我们要利用Spring Cache的特性,将缓存存储在Redis中,以提升应用的性能。 首先,Spring Cache提供了`@Cacheable`、`@CacheEvict`和`@Caching`等注解,允许我们在...

    SSM与memcached整合项目Spring Cache

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

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

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

    Redis整合SpringCache实例

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

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

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

    spring-cache-4.2.xsd.zip

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

    springCache

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

    jar包-spring-modules-cache.jar

    本文将深入探讨Spring Modules Cache在jar包`spring-modules-cache.jar`中的核心概念和实现方式。 首先,`spring-modules-cache.jar`这个jar包是Spring Modules项目的一部分,该项目旨在为Spring框架提供一系列的...

    spring cache + redis 主从

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

    Spring cache

    #### 二、Spring Cache的基本使用 ##### 2.1 自定义缓存示例分析 在使用 Spring Cache 之前,通常我们需要自己实现缓存逻辑。下面是一个简单的自定义缓存管理器实现示例: 1. **实体类 Account**:表示账户信息,...

    使用springCache实现缓存

    使用springCache实现缓存

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

    **二、Spring Cache** Spring Cache 是 Spring 框架的一部分,它提供了一种抽象的缓存支持,可以应用于任何缓存系统,包括 Redis。要启用 Spring Cache,你需要在配置类中声明 `@EnableCaching` 注解,并配置缓存...

Global site tag (gtag.js) - Google Analytics