memcached java配置_从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

本文介绍了如何在 Java 项目中集成 Memcached 缓存,选择了 XMemcached 作为客户端,讲解了安装 Memcached 服务、创建配置文件、在 Spring 中配置缓存、建立缓存基础类以及实现缓存操作的方法,旨在提供一种简单的缓存集成方案。
摘要由CSDN通过智能技术生成

Memcached 客户端选择

Memcached Client for Java

SpyMemcached

XMemcached

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

一些基础的准备

首先,你要下载一个 memcached 服务端安装一下,这是他的网址:https://github.com/memcached/memcached/wiki/ReleaseNotes,如果是 Windows 系统,自己去找安装包安装一下即可。启动服务。

开试写代码吧

一、在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

二、在applicationContext.xml文件中配置

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

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

${server1.memcached.host}

${server1.memcached.port}

${server2.memcached.host}

${server2.memcached.port}

${server1.memcached.weight}

${server2.memcached.weight}

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

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

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

1.新建cn.mayongfa.cache包我就说了,大家都会的,重要的是建完包之后要在applicationContext.xml文件中配置扫描包,完成 Bean 的注入 。就是下面:

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);

}

我们改成了这样的:

@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);

}

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

上一篇文章我讲了整个选择缓存的心路历程,虽然没有干货,但都是值得思考的东西,这篇文章就有了干货,可以让你用「最原始版」方式来灵活在项目中实现缓存。希望我的分享对你有所帮助吧,所有这些配置及代码都可以在我的 GitHub 上关于 Spring 的示例项目看到:https://github.com/mafly/SpringDemo/tree/memcached。

又写到凌晨一点,我睡了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值