简单的Spring Memcached – Spring缓存抽象和Memcached

在任何读取繁重的数据库应用程序中,缓存仍然是最基本的性能增强机制之一。 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为鸿蒙系统是否上线,华为官方:鸿蒙系统2.0上线,手机能否搭载鸿蒙操作系统?...

原标题&#xff1a;华为官方&#xff1a;鸿蒙系统2.0上线&#xff0c;手机能否搭载鸿蒙操作系统&#xff1f;华为官宣鸿蒙已经过去有一年多的时间了。近日有消息称&#xff0c;在今年九月份华为即将举办开发者大会&#xff0c;届时正式发布鸿蒙2.0操作系统&#xff0c;相比之前…

图解 继电器模组接线图_交流接触器,继电器的知识你了解多少?(值得收藏)...

↑↑↑↑↑领取福利的小伙伴&#xff0c;先点击上方关注我们哦(文章字体较小&#xff0c;请点击放大后查看)交流接触器(Alternating Current Contactor)广泛用作电力的开断和控制电路。型号与参数交流接触器的型号很多&#xff0c; CJ0、CJ10系列交流接触器较为常用&#xff0c…

python - 数据类型

python - 数据类型&#xff1a; 基本类型&#xff1a; 1.数字 整数int 长整型long 浮点型float 2.字符串 文本str 字节bytes 3.布尔 true false数据集&#xff1a; 1.列表list 2.元祖tuple (数组) 3.字典dict 有序字典 无序字典 4.集合set 有序集合 无序集合-----------------…

CSS :root 测试

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> <style> :root {background:blue;--vvv:60px; } </style> </head> <body><h1 style" font-siz…

折线图表android,Android 折线图表MPAndroidChart的实现

昨日夜观天象&#xff0c;今日忽见北斗星陨落&#xff0c;《Android 折线图表》应运而生。single.pngmany.png一.本篇采用MPAndroidChart&#xff0c;大体实现步骤可分为两步&#xff1a;1.配置基本属性(包括X,Y轴)2.设置折线数据并添加复制代码二. 第一步&#xff0c;配置基本…

发个自己的CSS重置基础代码

关于css的重置代码有很多&#xff0c;也有不少人写过适合不同站点的重置代码&#xff0c;这里发个浩子平时使用的额方法。 代码如下&#xff1a; /* haozi / hao.chenqq.com / 2011.06.15 */body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,inp…

我最喜欢的Java高级开发人员书籍

我上一篇博客文章 &#xff08;我对高级Java开发人员的十个最喜欢的在线资源&#xff09;的想法是由Xiaoran Wang发表的针对高级Java开发人员的十大网站的启发。 Wang还写了一篇名为《面向Java高级开发人员的十大书籍》的文章。 正如关于高级Java开发人员的最佳网站上的帖子一样…

pyplot绘制图片_matplotlib系列之pyplot

pyplot对象包含了一系列用于绘图的函数&#xff0c;使得它工作起来就像MATLIB一样。它的功能例如&#xff1a;创建一个figure对象绘制一片绘图区域在区域中绘制线条或者点也可以绘制labels使用pyplot对象快速的生成一幅图片import matplotlib.pyplot as pltplt.subplot(121)plt…

字符串-----KMP竟然是18禁

今天学了一下午字符串&#xff0c;讲到结束也没讲KMP。有人问老师为什么不讲&#xff0c;老师来一句&#xff1a;字符串noip不考&#xff0c;而且还是18禁&#xff0c;自然不讲。【手动滑稽】 所以我也不讲。【微笑】 1.表达式树 表示35*8 最后计算的符号是根节点&#xff0c;是…

freopen()函数在ACM中的使用

#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endif https://blog.csdn.net/cfzjxz/article/details/7240165转载于:https://www.cnblogs.com/LLbinGG/p/9414366.html

CSS3详解:background

CSS3对于background做了一些修改&#xff0c;最明显的一个就是采用设置多背景&#xff0c;不但添加了4个新属性&#xff0c;并且还对目前的属性进行了调整增强。 1、多个背景图片 在css3里面&#xff0c;你可以再一个标签元素里应用多个背景图片。代码类似与css2.0版本的写法…

里bl2和bl3为什么分开_英国的水池为什么有两个水龙头?为什么英国有独立的冷热水龙头?...

如果大家看过我之前的文章&#xff0c;可能会有点映像&#xff0c;前面有提到过英国的双水龙头&#xff0c;有兴趣的朋友们可以点后面的直达链接查看&#xff1a;为什么在英国留学会掉头发&#xff1f;怎么办&#xff1f;英国的自来水&#xff08;冷水&#xff09;可以直接喝吗…

html5中折叠面板,Ant Design中折叠面板Collapse

这段时间做react项目遇到一些平常并不会去在意的问题&#xff0c;但解决的时候又需要思考一番。这次开发用到了蚂蚁金服的UI框架Ant Design。项目中有一个模块的样式和功能用到了折叠面板Collapse组件来实现。但是开发完成后有一个问题被产品提到了。问题是这样的&#xff0c;因…

在JBoss的服务器端正确解码URL参数

我今天花了很多时间来弄清楚如何在运行在JBoss上的JSF应用程序中&#xff08;使用JBoss 7 Final&#xff09;强制正确解码编码的字符。 当您有例如通过URL传递中文字符时&#xff0c;就会出现此问题。 假设您有指点事件&#xff0c;编码为&#xff05;E6&#xff05;8C&#xf…

三剑客 老大:awk命令用法

awk是一种编程语言&#xff0c;用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一 个或多个文件&#xff0c;或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能&#xff0c;是linux/unix下的一个强大编程工具。它在命令行中使用&…

SpriteKit在复制节点时留了一个巨坑给开发者,需要开发者手动把复制节点的isPaused设置为false...

根据When an overlay node with actions is copied there is currently a SpriteKit bug where the node’s isPaused property might be set to true提示&#xff0c;SpriteKit有一个Bug需要开发者自己来填。 SpriteNode节点在被copy()复制后&#xff0c;会自动被设置为暂停&a…

HTML5 Shiv #8211; 让该死的IE系列支持HTML5吧

下面是引用Google的html5.js文件&#xff0c;好处就不说了&#xff1a; <!--[if IE]><script src”http://html5shiv.googlecode.com/svn/trunk/html5.js”></script>< ![endif]--> 将上代码复制到head部分&#xff0c;记住一定要是head部分&#xf…

android如何导入活动,关于android:如何将活动值传递给另一个活动(Kotlin)

我是Kotlin的新手&#xff0c;我正在尝试为我的应用进行设置活动&#xff0c;我希望该活动将其价值传递给其他活动。 我尝试了不同的代码&#xff0c;但没有一个起作用&#xff0c;我尝试制作一个共享的首选项文件&#xff0c;但我不知道如何编写代码要清楚&#xff0c;我想将字…

Mockito –带有注释和静态方法的额外接口

在代码中&#xff0c;我最近遇到了一段非常糟糕的代码&#xff0c;这些代码基于对对象执行某些操作的类转换。 当然&#xff0c;代码需要重构&#xff0c;但是如果您首先没有对该功能进行单元测试&#xff0c;则有时您可能无法做到/或者不想这样做&#xff08;这应该是可以理解…

怎么把原来的墙拆掉_家装拆除不是简单的砸砸墙,它也是有技术的

装修拆除中有很多人认为&#xff0c;拆除施工没有什么技术含量&#xff0c;感觉就像小品演的那样&#xff0c;挥挥大锤砸砸墙就可以了。所以有的人图便宜就从马路上随便找的工人来砸墙&#xff0c;他们不管是不是承重墙&#xff0c;只要业主要求他们就敢咋&#xff0c;后果真有…