前言
Memcached 是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)的一个高性能的分布式内存对象缓存系统,其存储性能在某些方面不比redis差,甚至在文本类型数据的存储上性能略优于redis,本文将介绍如何在springboot中集成memcached。
准备工作
Windows 下安装 Memcached
1、解压下载的安装包到指定目录。
2、在 memcached1.4.5 版本之后,memcached 不能作为服务来运行,需要使用任务计划中来开启一个普通的进程,在 window 启动时设置 memcached自动执行。
我们使用管理员身份执行以下命令将 memcached 添加来任务计划表中:
schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"
注意:你需要使用真实的路径替代 c:\memcached\memcached.exe。
注意:-m 512 意思是设置 memcached 最大的缓存配置为512M。
注意:我们可以通过使用 "c:\memcached\memcached.exe -h" 命令查看更多的参数配置。
3、如果需要删除 memcached 的任务计划可以执行以下命令:
schtasks /delete /tn memcached
java 客户端操作memcached
首先我们需要一款客户端连接对象,类似于我们在使用redis时使用的jedis , 目前memcached主流的客户端是Xmemcached,如果使用的是maven构建项目,则引入对应的依赖
<!--引入memcached-->
<dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>2.4.5</version>
</dependency>
配置
memcached在yml(properties)文件的相关配置
# memcached配置 memcached: server: 1.1.1.1:3333 2.2.2.2:4444 #memcached服务器集群(格式为host:port,多个服务器之间用空格隔开) opTimeout: 3000 #接口操作的默认超时时间,可以被接口覆盖 poolSize: 10 #池子大小 failureMode: false #是否开启失败模式,默认为false enabled: true # 是否使用memcached缓存
将memcached的配置由bean来管理
package com.me.config.properties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * @author : wang zns * @date : 2018-12-19 */
@Data @Component @ConfigurationProperties(prefix = "memcached") public class MemcachedProperties { /** * 服务器 */ private String server; /** * 操作超时时间,可以被API覆盖 */ private Integer opTimeout; /** * 连接池大小 */ private Integer poolSize; /** * 是否开启失败模式 */ private boolean failureMode; /** * 是否使用memcached缓存 */ private boolean enabled; }
memcached配置类(创建memcached客户端对象,并注入spring容器中)
package com.me.config;
import cn.stylefeng.guns.config.properties.MemcachedProperties;
import lombok.extern.slf4j.Slf4j;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.command.BinaryCommandFactory;
import net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author : wang zns
* @date : 2018-12-19
*/
@Configuration
@Slf4j
public class MemcachedConfig {
@Autowired
private MemcachedProperties memcachedProperties;
@Bean(name = "memcachedClientBuilder")
public MemcachedClientBuilder getBuilder() {
MemcachedClientBuilder memcachedClientBuilder = new XMemcachedClientBuilder(memcachedProperties.getServer());
// 内部采用一致性哈希算法
memcachedClientBuilder.setSessionLocator(new KetamaMemcachedSessionLocator());
// 操作的超时时间
memcachedClientBuilder.setOpTimeout(memcachedProperties.getOpTimeout());
// 采用二进制传输协议(默认为文本协议)
memcachedClientBuilder.setCommandFactory(new BinaryCommandFactory());
// 设置连接池的大小
memcachedClientBuilder.setConnectionPoolSize(memcachedProperties.getPoolSize());
// 是否开起失败模式
memcachedClientBuilder.setFailureMode(memcachedProperties.isFailureMode());
return memcachedClientBuilder;
}
/**
* 由Builder创建memcachedClient对象,并注入spring容器中
* @param memcachedClientBuilder
* @return
*/
@Bean(name = "memcachedClient")
public MemcachedClient getClient(@Qualifier("memcachedClientBuilder") MemcachedClientBuilder memcachedClientBuilder) {
MemcachedClient client = null;
try {
client = memcachedClientBuilder.build();
} catch(Exception e) {
log.info("exception happens when bulid memcached client{}",e.toString());
}
return client;
}
}