• Spring学习(六)——集成memcached客户端


    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:Memcachedmemcached-win32-1.4.4-14。

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

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

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

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

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

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

    image

    以上安装过程参考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下载。

  • 相关阅读:
    【css】rem及其替换方案
    【css】如何实现环形进度条
    【js】我们需要无限滚动列表吗?
    【js】再谈移动端的模态框实现
    【js】callback时代的变更
    【js】为什么要使用react+redux
    【js】JavaScript parser实现浅析
    【css】回想下经典的布局
    【JS】温故知新: 从parseInt开始
    【渲染原理】浏览器渲染原理的个人整理
  • 原文地址:https://www.cnblogs.com/wenjingu/p/3831653.html
Copyright © 2020-2023  润新知