1.Memcache
- 官网,http://memcached.org/。
- 安装和商用命令。
- 下载memcache包,包含libgcc_s_sjlj-1.dll、memcached.exe、pthreadGC2.dll。
- 管理员身份按照。memcached.exe -d install。
- 启动。memcached.exe -d start。
- 停止。memcached.exe -d stop。
- docket创建memcache容器。
docker run --name memcache -d -p 11211:11211 -e MEMCACHED_USERNAME=root -e MEMCACHED_PASSWORD=123456 -e MEMCACHED_MAX_MEMORY=64m memcached
2.Memcache和Redis的区别
-
Memcache,只支持k/v数据结构,可以设置过期时间,Memcache一般只用来做缓存。Redis支持的数据结构更加的丰富,如支持string、hash、list、set、zset,Redis除了进行缓存之外,还可以做分布式锁、订阅/发布、积分榜。
-
Memcache不支持持久化,Redis支持持久化。
-
Memcache直接将数据保存在物理内存中,Redis有自己的VM机制。
-
Redis使用的单线程IO复用网络模型, 而Memcached多线程非阻塞IO复用模型。
-
Value值大小不同:Redis最大可以达到512MB;Memcached只有1MB。
-
Memcache不能将数据迁移到其他的Memcache中;Redis主从直接可以进行数据同步。
-
在一些老的项目中会使用到Memcache,通过如果项目中需要缓存文件、图片数据可以使用Memcache。
3.Java中操作memcache
- Java有三种方式可以用来操作memcache,分别为Memcached-java-client、Spymemcached和XMemcached。主要使用XMemcached操作。
- 引入依赖。
<dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>2.4.8</version>
</dependency>
- 代码操作。
public static void test() throws Exception {
// 服务地址和端口
String services = "127.0.0.1:11211";
// 创建客户端连接
MemcachedClient memcachedClient = new XMemcachedClientBuilder(services)
.build();
// get
Object o = memcachedClient.get("k1");
System.out.println(o); // null
// set
boolean set = memcachedClient.set("k1", 0, "v1");
System.out.println(set); // true
o = memcachedClient.get("k1");
System.out.println(o); // v1
}
-
整合Springboot并使用线程池维护memcache连接。
- 引入依赖。
<dependency> <groupId>com.googlecode.xmemcached</groupId> <artifactId>xmemcached</artifactId> <version>2.4.8</version> </dependency>
- application.yaml中配置ip和端口信息。
memcached: # memcached服务器集群(格式为host:port,多个服务器之间用空格隔开) server: 127.0.0.1:11211 # 调用的超时时间 opTimeout: 3000 # 连接池大小 poolSize: 10 # 是否开启失败模式 failureMode: false
- 添加XMemcachedConfig配置类。
@Configuration public class XMemcachedConfig { @Value("${memcached.server:127.0.0.1:11211}") private String server; @Value("${memcached.opTimeout:3000}") private Integer opTimeout; @Value("${memcached.poolSize:10}") private Integer poolSize; @Value("${memcached.failureMode:true}") private boolean failureMode; @Bean(name = "memcachedClient") public MemcachedClient getBuilder() throws IOException { MemcachedClientBuilder memcachedClientBuilder = new XMemcachedClientBuilder(server); // 采用一致性哈希算法 memcachedClientBuilder.setSessionLocator(new KetamaMemcachedSessionLocator()); // 操作的超时时间 memcachedClientBuilder.setOpTimeout(opTimeout); // 采用二进制传输协议(默认为文本协议) memcachedClientBuilder.setCommandFactory(new BinaryCommandFactory()); // 设置连接池的大小 memcachedClientBuilder.setConnectionPoolSize(poolSize); // 是否开起失败模式 memcachedClientBuilder.setFailureMode(failureMode); return memcachedClientBuilder.build(); } }
- 使用。
@Service public class UserService { @Resource private MemcachedClient memcachedClient; public void getUserById(Long id) throws InterruptedException, TimeoutException, MemcachedException { // get(key)会抛出很多的异常,在项目中可以在封装一层,将异常处理掉。 Object o = memcachedClient.get("user:" + id); System.out.println(o); } }