课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > Java培训机构: Spring集成Memcached缓存配置(二)
  • Java培训机构: Spring集成Memcached缓存配置(二)

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-27

  • Memcached客户端选择

    上一篇文章 Spring集成Memcached缓存配置(一)中昆明Java培训机构的老师讲到这篇要谈客户端的选择,在Java中一般常用的有三个:

    Memcached Client for Java

    SpyMemcached

    XMemcached

    他们的对比与性能我这里不讨论,想了解自己搜索查看,我这里使用的是XMemcached,据说它的并发效果更好一些。

    一些基础的准备

    首先,你要下载一个memcached服务端安装一下,,如果是Windows系统,自己去找安装包安装一下即可。启动服务。

    然后,你需要一个xmemcached.jar包,

    开试写代码吧

    一、在src目录下建立memcached.properties配置文件

    这个文件是用来存memcached服务器的地址、端口和权重的信息的

    memcached.connectionPoolSize=10 

    memcached.failureMode=true 

    #server1 

    server1.memcached.host=127.0.0.1

    server1.memcached.port=11211

    server1.memcached.weight=4

    #server2 

    server2.memcached.host=127.0.0.1

    server2.memcached.port=11212

    server2.memcached.weight=6

    昆明Java培训机构的老师这里是配置两台服务器用以测试,不同的权重。

    二、在applicationContext.xml文件中配置

    打开applicationContext.xml文件,在下面加入memcached的配置:

    <!-- Memcached配置-->

    <bean id="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder"

    p:connectionPoolSize="${memcached.connectionPoolSize}" p:failureMode="${memcached.failureMode}">

    <!-- XMemcachedClientBuilder have two arguments.First is server list,and second is weights array. -->

    <constructor-arg>

    <list>

    <bean class="java.net.InetSocketAddress">

    <constructor-arg>

    <value>${server1.memcached.host}</value>

    </constructor-arg>

    <constructor-arg>

    <value>${server1.memcached.port}</value>

    </constructor-arg>

    </bean>

    <bean class="java.net.InetSocketAddress">

    <constructor-arg>

    <value>${server2.memcached.host}</value>

    </constructor-arg>

    <constructor-arg>

    <value>${server2.memcached.port}</value>

    </constructor-arg>

    </bean>

    </list>

    </constructor-arg>

    <constructor-arg>

    <list>

    <value>${server1.memcached.weight}</value>

    <value>${server2.memcached.weight}</value>

    </list>

    </constructor-arg>

    <property ame="commandFactory">

    <bean class="net.rubyeye.xmemcached.command.TextCommandFactory" />

    </property>

    <property ame="sessionLocator">

    <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator" />

    </property>

    <property ame="transcoder">

    <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />

    </property>

    </bean>

    <!-- Use factory bean to build memcached client -->

    <bean id="memcachedClient" factory-bean="memcachedClientBuilder"

    factory-method="build" destroy-method="shutdown" />

    这里的地址及端口就是读取刚刚的memcached.properties配置文件。当然,你不能忘了把配置文件读取到Spring容器中管理。

    三、建立cn.mayongfa.cache包,并新增MemcachedBasis.java基础类

    1.新建cn.mayongfa.cache包昆明Java培训机构的老师就不说了,大家都会的,重要的是建完包之后要在applicationContext.xml文件中配置扫描包,完成Bean的注入。就是下面:

    <context:component-scan base-package="cn.mayongfa.cache" />

    2.新建MemcachedBasis.java类。

    @Component

    public class MemcachedBasis {

    @Autowired

    protected MemcachedClient memcachedClient;

    /**

    *失效时间(秒)3600*24一天

    */

    protected int Exptime = 3600 * 24;

    /**

    *基础数据失效时间(秒)3600*24*7一周

    */

    protected int DataExptime = this.Exptime * 7;

    protected String Prefix = "SPRINGDEMO:";

    }

    都是我们需要用的基本信息,就是一个基类的概念,主要用于其他缓存类继承它,就不需要重复定义这些变量了。

    四、新增UserBasisCache.java缓存类,继承于MemcachedBasis.java类

    @Component

    public class UserBasisCache extends MemcachedBasis {

    private Logger log = Logger.getLogger(UserBasisCache.class);

    @Autowired

    private UserBasisDao userBasisDao;

    /**

    *设置缓存

    *

    * @param model

    *           用户model

    * @return

    */

    public Boolean set(UserBasis model) {

    Boolean result = false;

    try {

    result = memcachedClient.set(getCacheKey(model.getId()), super.Exptime, model);

    } catch (TimeoutException | InterruptedException | MemcachedException e) {

    log.error("", e);

    }

    return result;

    }

    /**

    *获取缓存

    *

    * @param id

    *           用户ID

    * @return

    */

    public UserBasis get(long id) {

    UserBasis entity = new UserBasis();

    try {

    entity = memcachedClient.get(getCacheKey(id));

    if (entity == null || entity.getId() <= 0) {

    entity = userBasisDao.getEntity(id);

    this.set(entity);

    }

    } catch (TimeoutException | InterruptedException | MemcachedException e) {

    log.error("", e);

    entity = userBasisDao.getEntity(id);

    }

    return entity;

    }

    /**

    *删除缓存

    *

    * @param id

    *           用户ID

    * @return

    */

    public Boolean delete(long id) {

    try {

    return memcachedClient.delete(getCacheKey(id));

    } catch (TimeoutException | InterruptedException | MemcachedException e) {

    log.error("", e);

    }

    return false;

    }

    /**

    *获取缓存Key

    *

    * @param id

    *           用户ID

    * @return

    */

    private String getCacheKey(long id) {

    return super.Prefix + "UserBasis:" + id;

    }

    }

    这个就是具体的业务逻辑的缓存的获取、增加、修改和删除的处理了,这里是以每个用户来添加到缓存,只是用来演示的,具体的情况你们自己处理。

    还记不记得上篇文章说:我们怎么做到缓存对代码的侵入性,以及我们怎么更方便或者说不需要改代码就实现缓存。其实这个时候,我们会发现我们项目架构是分层的,分层的意义不就是为了分配职责、减小耦合和定义标准嘛 那这个时候我们如果都在实现层(Service.Imp)来实现缓存的增删改查,那是不是Controller层的调用就不需要任何改动了,也不需要考虑缓存怎么实现的了,不需要去执行缓存的增删改查了,还是像原来那样直接调用实现层的方法 行了。

    五、修改UserBasisServiceImp.java类,实现缓存的增删改查

    最开始这个类其中的方法是这样的:

    @Override

    public long Save(UserBasis entity) {

    return UserBasisdao.Save(entity);

    }

    @Override

    public Boolean Delete(long ID) {

    return UserBasisdao.Delete(ID);

    }

    @Override

    public UserBasis getEntity(long ID) {

    return UserBasisdao.getEntity(ID);

    }

    昆明Java培训机构的老师改成了这样的:

    @Autowired

    private UserBasisCache UserBasiscache;

    @Override

    public long Save(UserBasis entity) {

    long id = UserBasisdao.Save(entity);

    if (id > 0) {

    UserBasiscache.set(entity);

    }

    return id;

    }

    @Override

    public Boolean Delete(long ID) {

    boolean result = UserBasisdao.Delete(ID);

    if (result) {

    UserBasiscache.delete(ID);

    }

    return result;

    }

    @Override

    public UserBasis getEntity(long ID) {

    return UserBasiscache.get(ID);

    }

    看出来区别了吧,就是我们在实现层处理了缓存的操作,并不需要去最外层的调用处处理了。

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:如何定制自己的mybatis生成

下一篇:Java程序员:Spring集成Memcached缓存配置(一)

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56