memcached是高性能的分布式内存缓存服务器。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。

但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。memcached特别适合

用来解决上述问题,它可以缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。本例将在前一篇中

实现的Demo程序基础上集成memcached客户端。

1、单个服务端安装部署

官网http://memcached.org/downloads上没有提供windows版本,只有源码,可以自己编译。

另外,网上找到网友分享的下载链接:

http://code.jellycan.com/memcached/ 这个链接似乎有点问题,如果有人下载成功望告知。

http://www.jb51.net/softs/44843.html 这个可以用。

1.1、解压到指定目录,如:C:\Memcached\memcached-win32-1.4.4-14。

1.2、用cmd打开命令窗口,转到解压的目录,输入 “memcached.exe -d install”。

1.3   打开控制面板,打开服务,可以看到memcached已经在上面可,如果没有启动,则手动启动一下。

或者执行:'D:\memcached\memcached.exe -d start'启动,这样memcache就会作为windows系统服务在每 次开机时启动memcache服务。

1.4  使用telnet localhost 11211命令验证缓存服务器是否可用。

如果是Windows7系统下,需要先通过“控制面 板” 一〉“程序” 一〉“打开或关闭windows功能”,安装“telnet客户端”。

1.5 开始什么都不显示,回车后输入命令  stats  查看统计信息,如下图,说明服务器运作正常。

以上安装过程参考http://www.jb51.net/article/30334.htm

2、在Spring框架中集成客户端

2.1 修改gradle文件,增加依赖包,代码如下:

apply plugin: 'idea'
apply plugin: 'java' repositories {
mavenCentral()
maven { url "http://repo.spring.io/release" }
} dependencies {
compile(
"org.springframework:spring-context:4.0.5.RELEASE",
"org.springframework:spring-web:4.0.5.RELEASE",
"org.springframework:spring-webmvc:4.0.5.RELEASE",
"org.springframework:spring-context-support:4.0.5.RELEASE",
"org.apache.velocity:velocity:1.7",
"org.apache.velocity:velocity-tools:2.0",
"org.anarres.gradle:gradle-velocity-plugin:1.0.0",
"org.springframework:spring-jdbc:4.0.5.RELEASE",
"commons-dbcp:commons-dbcp:1.4",
"org.springframework:spring-test:4.0.5.RELEASE",
"org.testng:testng:6.8.8",
"org.mybatis:mybatis:3.2.7",
"org.springframework:spring-tx:4.0.5.RELEASE",
"org.springframework:spring-orm:4.0.5.RELEASE",
"org.mybatis:mybatis-spring:1.2.2",
"com.googlecode.xmemcached:xmemcached:2.0.0",
"com.google.guava:guava:17.0",
"org.codehaus.jackson:jackson-mapper-asl:1.9.13",
"com.google.code.simple-spring-memcached:simple-spring-memcached:3.5.0",
"com.google.code.simple-spring-memcached:xmemcached-provider:3.5.0"
)
testCompile("org.springframework:spring-test:4.0.5.RELEASE")
runtime("jstl:jstl:1.2")
} task copyJars(type: Copy) {
from configurations.runtime
into 'lib' // 目标位置
}

运行命令:gradle copyJars下载。

2.2 修改Spring配置文件,加入以下配置:

<import resource="simplesm-context.xml" />
<import resource="xmemcached.xml"/>

2.3 在resources下添加文件xmemcached.xml,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> <aop:aspectj-autoproxy proxy-target-class="true"/> <bean name="defaultMemcachedClient" class="com.google.code.ssm.CacheFactory">
<property name="cacheClientFactory">
<bean 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>
</beans>

2.4 修改domain文件夹下的User实体,修改如下:

@CacheKeyMethod
public String getUserName() {
return userName;
}

通过@CacheKeyMethod标签为实体指定Key值

2.5 修改dao文件夹下的getUserByUserName函数,如下:

@ReadThroughSingleCache(namespace = NAMESPACE, expiration = 3600)
@Override
public User getUserByUserName(@ParameterValueKeyProvider String userName) {
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return (User)sqlSession.selectOne("domain.User.getUserByUserName", userName);
}

添加@ReadThroughSingleCache切入点表示:组件首先从缓存中读取数据,取到数据则跳过查询方法,直接返回。

取不到数据再执行查询方法,并将查询结果放入缓存,以便下一次获取。

namespace参数自己指定,与其他实体相区分即可;expiration表示缓存失效时间,单位秒。

@ParameterValueKeyProvider指定的参数,如果该参数对象中包含CacheKeyMethod注解的方法,则调用其方法,否则调用toString方法。

为了查看测试效果,进入查询方法后执行Thread.sleep(4000)等待4秒。

2.6 单元测试

修改getUserByUserName函数,打印出执行时间。

@Test
public void getUserByUserName() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println(df.format(new Date())); //×××××××××××××××1
User user = userService.getUserByUserName("admin");
System.out.println(df.format(new Date()));//×××××××××××××××2 // assertEquals(user.getUserName(), "admin"); user = userService.getUserByUserName("admin");
System.out.println(df.format(new Date()));//×××××××××××××××3
assertEquals(user.getUserName(), "admin");
}

测试结果:1,2处打印的时间间隔大于等于4秒,2,3处打印的时间间隔小于4秒,符合预期。

源码下载:http://files.cnblogs.com/wenjingu/VelocityDemo5.0.zip  lib中的jar包上传时已删除,请运行命令:gradle copyJars下载。

Spring学习(六)——集成memcached客户端的更多相关文章

  1. Spring学习(六)-----Spring使用@Autowired注解自动装配

    Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...

  2. spring学习 六 spring与mybatis整合

    在mybatis学习中有两种配置文件 :全局配置文件,映射配置文件.mybatis和spring整合,其实就是把mybatis中的全局配置文件的配置内容都变成一个spring容器的一个bean,让sp ...

  3. Spring学习(六)--渲染Web视图

    一.将模型数据渲染为Html 在上一篇文章中,我们所编写的控制器方法都没有直接产生浏览器中渲染所需的HTML.这些方法只是将数据填充到模型中,然后将模型传递给一个用来渲染的视图.这些方法会返回一个St ...

  4. Spring学习六(事物管理)

    参考链接 http://www.mamicode.com/info-detail-1248286.html http://www.cnblogs.com/wangdaqian/archive/2017 ...

  5. spring学习六

    1: @Valid 注解    @NotNull(message="名字不能为空") private String userName; @Max(value=120,message ...

  6. spring学习六----------Bean的配置之Aware接口

    © 版权声明:本文为博主原创文章,转载请注明出处 Aware Spring提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化后,可以获取相应的资源 通过Aware接口,可以对S ...

  7. Spring学习(六)

    AOP和OOP 1.OOP:Object-Oriented Programming,面向对象程序设计,是静态的,一旦类写死了就不能改变了,要更改就得修改代码重新编译,父类类型引用指向对象来实现动态性. ...

  8. Spring学习六:自定义Event事件

    Spring 中的自定义事件 编写和发布自己的自定义事件有许多步骤.按照在这一章给出的说明来编写,发布和处理自定义 Spring 事件. 步骤 描述 1 创建一个名称为 SpringExample 的 ...

  9. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

随机推荐

  1. [LigerUI]使用记录

    1. 下拉框设定 鼠标移开隐藏 但想改变下拉框大小时 很难一次定位到下拉框右下角那个点 2. ligerTab 自带标题菜单 但想修改成类似于 chrome 的标题菜单时 貌似没有找到方法 我用 ea ...

  2. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块

    HACK #3 如何编写内核模块 本节将介绍向Linux内核中动态添加功能的结构—内核模块的编写方法.内核模块Linux内核是单内核(monolithic kernel),也就是所有的内核功能都集成在 ...

  3. android studio 3.0.1使用笔记(二)

    发布前如何生成正式签名的APK? 一,查看APK签名方法:??Preferences->Android->Build可以查看到这个默认keystore文件的位置. 二,新建正式签名过程: ...

  4. IOS学习计划

    自从接触了IOS后,都没有像样的写过一篇博客去总结这近三个月来对IOS开发的了解.今天,趁着有那么一点的时间,写一下接下来的学习计划和学习路线,以便于自己今后接下来的时间可以更有方向感,更有效率的去学 ...

  5. JAVA获取txt文件内容

    JAVA 读取txt文件内容 通常,我们可以直接通过文件流来读取txt文件的内容,但有时可能会出现乱码!此时只要设置一下文件字符编码即可. public class txttest { /** * 读 ...

  6. SystemColors 成员

    名称 说明 ActiveBorder 获取 Color 结构,它是活动窗口边框的颜色. ActiveCaption 获取 Color 结构,它是活动窗口标题栏的背景色. ActiveCaptionTe ...

  7. 基于HALCON的双目立体视觉系统实现

    双目立体视觉是机器视觉的一种重要形式,它是基于视差原理并由多幅图像获取物体三维几何信息的方法.双目立体视觉系统一般由双摄像机从不同角度同时获得被测物的两幅数字图像,或由单摄像机在不同时刻从不同角度获得 ...

  8. VMware 克隆网卡无法启动

    问题描述: 最近学习 hadoop,环境准备搭建在虚拟机之上,装好一台虚拟机克隆完成后,网卡无法启动. 多年前,初学 Linux 的时候,就遇到过这个问题,记录的笔记找不到了,简单记录一下. shel ...

  9. nodejs-supervisor

    小技巧——使用 supervisor 如果你有 PHP 开发经验,会习惯在修改 PHP 脚本后直接刷新浏览器以观察结果,而你在开发 Node.js 实现的 HTTP 应用时会发现,无论你修改了代码的哪 ...

  10. [转] 移动平台Html5的viewport使用经验

    转自:http://blog.csdn.net/wuruixn/article/details/8591989 问题描述 web页面采用html5技术实现,在系统登录页面中使用frameset.fra ...