前言
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; } }