在任何读取繁重的数据库应用程序中,缓存仍然是最基本的性能增强机制之一。 Spring 3.1发行版提供了一个很酷的新功能,称为Cache Abstraction 。 Spring Cache Abstraction为应用程序开发人员提供了一种简单,透明和分离的方式来实现任何缓存解决方案。 Memcached是跨应用程序使用的最受欢迎的分布式缓存系统之一。 在本文中,我们将重点介绍如何将Memcached与启用Spring的应用程序集成。 由于Spring仅直接支持Ehcache和ConcurrentHashMap,因此我们将使用第三方库Simple Spring Memcache来利用Spring缓存抽象的功能。

获取代码

可以从以下SVN位置下载本教程的代码。 https://www.assembla.com/code/weblog4j/subversion/nodes/24/SpringDemos/trunk为了使本教程正常工作,请在您的数据库中创建下表。 然后在springcache.xml中修改数据源。

CREATE  TABLE IF NOT EXISTS `adconnect`.`books` (`book_id` INT NOT NULL AUTO_INCREMENT ,`book_name` VARCHAR(500) NULL ,`book_author` VARCHAR(500) NULL ,`category` VARCHAR(500) NULL ,`numpages` INT NULL ,`price` FLOAT NULL ,PRIMARY KEY (`book_id`) )
ENGINE = InnoDB;

整合步骤

1. 依赖关系–我还假设您已经设置了休眠,弹簧和日志。 因此,要下载SSM依赖项,请在POM中添加以下内容。 有关全套依赖项,请从上面的SVN网址下载该项目。

<dependency><groupId>com.google.code.simple-spring-memcached</groupId><artifactId>spring-cache</artifactId><version>3.1.0</version>
</dependency><dependency><groupId>com.google.code.simple-spring-memcached</groupId><artifactId>xmemcached-provider</artifactId><version>3.1.0</version>
</dependency>

2. 启用缓存 –要在您的spring应用程序中启用缓存,请在spring上下文xml中添加以下内容。

<cache:annotation-driven/>

3. 配置Spring以启用基于Memcached的缓存 –在应用程序上下文xml中添加以下内容。

<bean name="cacheManager" class="com.google.code.ssm.spring.SSMCacheManager"><property name="caches"><set><bean class="com.google.code.ssm.spring.SSMCache"><constructor-arg name="cache" index="0" ref="defaultCache"/><!-- 5 minutes --><constructor-arg name="expiration" index="1" value="300"/><!-- @CacheEvict(..., "allEntries" = true) doesn't work --><constructor-arg name="allowClear" index="2" value="false"/></bean></set></property></bean><bean name="defaultCache" class="com.google.code.ssm.CacheFactory"><property name="cacheName" value="defaultCache"/><property name="cacheClientFactory"><bean name="cacheClientFactory" class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl"/></property><property name="addressProvider"><bean class="com.google.code.ssm.config.DefaultAddressProvider"><property name="address" value="127.0.0.1:11211"/></bean></property><property name="configuration"><bean class="com.google.code.ssm.providers.CacheConfiguration"><property name="consistentHashing" value="true"/></bean></property></bean>

SSMCacheManager扩展了org.springframework.cache.support.AbstractCacheManager –它是一个抽象类,并且是基础缓存的管理器。

SSMCache实现org.springframework.cache.Cache –这是底层缓存客户端api的实际包装器回合。

4. 注释驱动缓存 – Spring使用注释来标记要由缓存管理的方法。 这些是Spring缓存框架定义的注释

  1. @Cacheable –此批注用于标记要缓存其结果的方法。 如果调用了可缓存的方法,那么spring首先查看该方法的结果是否被缓存。 如果它存在于缓存中,则将结果从那里拉出,然后进行方法调用。
  2. @CachePut –标有cacheput批注的方法始终运行,并将其结果推送到缓存。 您不应将Cacheput和Cacheable批注放在相同的方法上,因为它们的行为不同。 Cacheput将导致方法始终执行,而可缓存的结果将导致方法仅执行一次。
  3. @CacheEvict –此注释导致从缓存中逐出对象。 通常在更新结果对象时使用此方法,因此需要清除缓存中的旧对象。
  4. @Caching –如果要在一个方法上放置多个相同类型的注释,则使用此注释。

@Cacheable演示

@Cacheable(value = "defaultCache", key = "new Integer(#book_id).toString().concat('.BookVO')")public BookVO get(int book_id) throws Exception {BookVO bookVO = null;try{Query query = getSession().createQuery("from BookVO bookVO where bookVO.book_id=:book_id");query.setLong("book_id", book_id);bookVO =  (BookVO)query.uniqueResult();}catch(HibernateException he){log.error("Error in finding a bookVO : " + he);throw new Exception("Error in finding adPicVO by book_id for book_id : " + bookVO, he);}return bookVO;}

请注意注释的键属性。 这是Spring Expression Language的示例。 您可以根据需要使用SePL use创建memcache密钥。 在此示例中,我想要一个键,其格式应为<book_id> .BookVO。

另一个示例–假设我要存储给定作者的bookVO列表,在这种情况下,我可以使用格式为<author_name> .BookVOList的唯一键,因此可以使用以下键

@Cacheable(value = "defaultCache", key = "#author.concat('.BookVOList')")public List<BookVO> getList(String author) throws Exception {

@CachePut演示

@CachePut(value = "defaultCache", key = "new Integer(#bookVO.book_id).toString().concat('.BookVO')")public BookVO create(BookVO bookVO) throws Exception {try{getSession().save(bookVO);getSession().flush();}catch(HibernateException he){log.error("Error in inserting bookVO : " + he);throw new Exception("Error in inserting bookVO", he);}return bookVO;}

插入数据时可以使用CachePut,插入后可以将插入的数据放入缓存中

@CacheEvict演示

@CacheEvict(value = "defaultCache", key = "new Integer(#bookVO.book_id).toString().concat('.BookVO')")public BookVO update(BookVO bookVO) throws Exception {try{Query query = getSession().createQuery("update BookVO bookVO set bookVO.book_name=:book_name, bookVO.book_author=:book_author,bookVO.category=:category,bookVO.numpages=:numpages,bookVO.price=:price " +"where bookVO.book_id=:book_id");query.setString("book_name", bookVO.getBook_name());query.setString("book_author", bookVO.getBook_author());query.setString("category", bookVO.getCategory());query.setInteger("numpages", bookVO.getNumpages());query.setFloat("price", bookVO.getPrice());query.setLong("book_id", bookVO.getBook_id());query.executeUpdate();}catch(HibernateException he){log.error("Error in updating bookVO : " + he);throw new Exception("Error in updating bookVO", he);}return bookVO;}

资源资源

  1. https://code.google.com/p/simple-spring-memcached/
  2. http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/cache.html
  3. http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/expressions.html
  4. http://static.springsource.org/spring/docs/3.1.0.M1/javadoc-api/index.html?org/springframework/cache/CacheManager.html
  5. http://doanduyhai.wordpress.com/2012/07/01/cache-abstraction-in-spring-3/
  6. http://viralpatel.net/blogs/cache-support-spring-3-1-m1/
参考: Simple Spring Memcached –来自我们的JCG合作伙伴 Niraj Singh的Spring Caching抽象和Memcached ,位于Weblog4j博客上。

翻译自: https://www.javacodegeeks.com/2013/06/simple-spring-memcached-spring-caching-abstraction-and-memcached.html

简单的Spring Memcached – Spring缓存抽象和Memcached相关推荐

  1. Spring 3.1缓存抽象教程

    即将发布的Spring 3.1版本中引入的新功能之一是缓存抽象之一 . Spring Framework提供了对将缓存透明添加到现有Spring应用程序中的支持. 与事务支持类似,缓存抽象允许一致使用 ...

  2. Spring启动和缓存抽象

    缓存是大多数应用程序的主要组成部分,只要我们设法避免磁盘访问,缓存就会保持强劲. Spring对各种配置的缓存提供了强大的支持 . 您可以根据需要简单地开始,然后进行更多可定制的操作. 这将是spri ...

  3. Spring指南之使用Spring缓存数据(Spring Framework官方文档之缓存抽象详解)

    1.请参见官方文档Spring指南之使用 Spring 缓存数据 2.请参见Spring官方文档之缓存抽象 3.参见github代码 文章目录 一.简介 二.你将创造什么(What You Will ...

  4. (转)使用 Spring缓存抽象 支持 EhCache 和 Redis 混合部署

    背景:最近项目组在开发本地缓存,其中用到了redis和ehcache,但是在使用注解过程中发现两者会出现冲突,这里给出解决两者冲突的具体方案. spring-ehcache.xml配置: <?x ...

  5. Spring Boot————默认缓存应用及原理

    引言 应用程序的数据除了可以放在配置文件中.数据库中以外,还会有相当一部分存储在计算机的内存中,这部分数据访问速度要快于数据库的访问,因此通常在做提升数据访问速度时,会将需要提升访问速度的数据放入到内 ...

  6. 基于Spring的Web缓存

    缓存的基本思想其实是以空间换时间.我们知道,IO的读写速度相对内存来说是非常比较慢的,通常一个web应用的瓶颈就出现在磁盘IO的读写上.那么,如果我们在内存中建立一个存储区,将数据缓存起来,当浏览器端 ...

  7. Spring 3.1缓存和@Cacheable

    缓存在软件领域已经存在很长时间了. 它们是那些真正有用的东西之一,一旦您开始使用它们,您会想知道如果没有它们,您是如何相处的,所以似乎让Spring的家伙们只是在版本中向Spring核心添加缓存实现有 ...

  8. 【Java进阶营】阿里架构师手把手教你如何简单快捷地构建Spring应用

    一.Spring介绍 1.1 SpringBoot简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些 ...

  9. Spring的三级缓存

    Spring三级缓存 对象创建的过程 spring的三级缓存分别是 // 从上至下 分表代表这"三级缓存"private final Map<String, Object&g ...

最新文章

  1. 云服务器如何导入文件,如何将文件导入云服务器中
  2. Tensorflow中placeholder传入值与feed_dict喂食器的联系与用法
  3. [ARM异常]-linux中(aarch/aarch64)异常向量表介绍
  4. boost::graph模块实现在无向图上使用连通分量算法
  5. Go 语言开发第一天,我的学习之路从这里开始
  6. 详解华为交换机iStack特性
  7. 神经网络人口预测matlab,BP神经网络预测(人口)程序(matlab)
  8. C#中,当从数据库中查询到数据,以DataTable类型返回后,如果需要对DataTable中的数据进行筛选,可以选择下面的方式...
  9. Git master branch has no upstream branch的解决
  10. java B2B2C Springboot多租户电子商城系统-Spring Cloud Stream(消息驱动)
  11. 瀑布流 jquery。
  12. MongoDB自学日记1——基本操作
  13. win7一直显示正在关机_当办公场所没有WIFI,有网线,笔记本如何在 win7建立无线网络...
  14. 利用matlab函数创建数组
  15. 光耦p621引脚图_p421光耦引脚图和代换
  16. rm -rf 命令 与正则表达式
  17. 数字图像处理(4): 遥感影像中 光谱分辨率、空间分辨率、时间分辨率、全色图像、多光谱图像、高光谱图像 的区别
  18. Google gflags使用说明
  19. pycharm使用xshell+xming调用服务器图形界面
  20. Python 声音降噪

热门文章

  1. springboot创建项目
  2. 可视化大屏设计尺寸_可视化大屏设计_酷炫不是最高效的大屏展示的唯一标准...
  3. python模板模式_python-模板方法模式
  4. maven项目不编译xml文件
  5. Spring [CVE-2022-22965]漏洞处理
  6. lua加密教程_我们相信加密! 教程
  7. 微服务pact测试框架_消费者驱动的Pact和Spring Boot测试
  8. php cdi_本机CDI限定词:@Any和@Default
  9. java8 函数式编程_使用Javaslang进行Java 8中的函数式编程
  10. HttpClient 4 API –获取状态码-getStatusLine()。getStatusCode()示例