昆明java培训
达内昆明广州春城路

18487146383

热门课程

Java培训机构: Spring集成Memcached缓存配置(二)

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

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培训】

上java培训有用吗?怎么衡量?【达内培训】

昆明java培训机构怎么选?昆明达内java培训怎么样?

学Java自学还是达内培训机构好?

选择城市和中心
贵州省

广西省

海南省

台湾