转载

SpringBoot(十):SpringBoot整合Memcached

一、环境准备

memcached 1.4.5

SpringBoot 1.5.10.RELEASE

java_memcached-release_2.6.6.jar

memcached 1.4.5 windows 下载地址:http://www.runoob.com/memcached/window-install-memcached.html

danga memcached java client 下载地址:https://github.com/gwhalin/Memcached-Java-Client/downloads

pom依赖:

<dependency>

<groupId>commons-pool</groupId>

<artifactId>commons-pool</artifactId>

<version>1.5.6</version>

</dependency>

<dependency>

<groupId>com.danga</groupId>

<artifactId>java_memcached-release</artifactId>

<version>2.6.6</version>

<scope>system</scope>

<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/java_memcached-release_2.6.6.jar</systemPath>

</dependency>

二、项目结构

SpringBoot(十):SpringBoot整合Memcached

三、代码详情

application.yml :

spring:

datasource:

driver-class-name: com.mysql.jdbc.Driver

url: jdbc:mysql://192.168.1.20:3306/test?useSSL=false

username: root

password: root123

rabbitmq:

host: 192.168.1.123

port: 5672

username: admin

password: 1234

# virtual-host: /vhost_test

# publisher-confirms: true

## Memcache 配置 ##

memcache:

servers: 127.0.0.1:11211

failover: true

initConn: 100

minConn: 20

maxConn: 1000

maintSleep: 50

nagel: false

socketTO: 3000

aliveCheck: true

logging.level.com.demo.mapper: debug

MemcacheConfiguration.java

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* @author zh
* @ClassName cn.saytime.config.config.MemcacheConfiguration
* @Description Memcache配置
*/
@Configuration
public class MemcacheConfiguration {

@Value("${memcache.servers}")
private String[] servers;
@Value("${memcache.failover}")
private boolean failover;
@Value("${memcache.initConn}")
private int initConn;
@Value("${memcache.minConn}")
private int minConn;
@Value("${memcache.maxConn}")
private int maxConn;
@Value("${memcache.maintSleep}")
private int maintSleep;
@Value("${memcache.nagel}")
private boolean nagel;
@Value("${memcache.socketTO}")
private int socketTO;
@Value("${memcache.aliveCheck}")
private boolean aliveCheck;

@Bean
public SockIOPool sockIOPool () {
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(servers);
pool.setFailover(failover);
pool.setInitConn(initConn);
pool.setMinConn(minConn);
pool.setMaxConn(maxConn);
pool.setMaintSleep(maintSleep);
pool.setNagle(nagel);
pool.setSocketTO(socketTO);
pool.setAliveCheck(aliveCheck);
pool.initialize();
return pool;
}

@Bean
public MemCachedClient memCachedClient(){
return new MemCachedClient();
}

}

测试类 SpringbootMemcacheApplicationTests.java

import com.danga.MemCached.MemCachedClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Date;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMemcacheApplicationTests {

@Autowired
private MemCachedClient memCachedClient;

@Test
public void contextLoads() throws InterruptedException {
// 放入缓存
boolean flag = memCachedClient.set("a", 1);

// 取出缓存
Object a = memCachedClient.get("a");
System.out.println(a);


// 3s后过期
memCachedClient.set("b", "2", new Date(3000));
Object b = memCachedClient.get("b");
System.out.println(b);

Thread.sleep(3000);
b = memCachedClient.get("b");
System.out.println(b);

}

}

先运行memcached,然后执行test,输出结果为:

1

2

null

测试memcached存取以及失效时间成功。

四、部分操作方法

set与add在key不存在时效果一致,add在key存在时不会成功。

set与replace在key存在时效果一致,replace在key不存在不会成功。

五、注意点

使用danga memcached设置失效时间有两种方式:

第一种

memCachedClient.set("xx", "xx", new Date(3000));

第二种

memCachedClient.set("xx", "xx", new Date(System.currentTimeMillis() + 3 * 1000));

对比两种形式,第一种是指定key在3s后过期,第二种是指定key在xxxx-xx-xx xx:xx:xx 时间点失效,如果服务器时间跟客户端时间不一致,就会跟想要的结果不一样,比如客户端现在时间点为2018-01-01 00:00:00,服务端时间为2018-01-01 00:00:10,服务端时间快10s,那么如果客户端使用第二种方式设置30s后失效,也就是2018-01-01 00:00:30失效,实际上客户端想要的是30s后失效,而服务端20s就将key失效了。

从上可以发现,最好是使用第一种形式,但是第一种形式在某些时间也会存在问题,比如如果设定的时间小于1s,会发现key会永久保存,不会在指定时间失效,原因可以通过源码得到。

说明当时间小于1s的时候,使用第一种方式会造成指定时间不生效,key永久存在,这种时间如果客户端服务端时间没有误差的时候,使用第二种形式。

关于memcached最大设置30天有效的情形暂时没有测试。

原文  https://www.maiyewang.com/2019/12/06/springboot(十):springboot整合memcached-2/
正文到此结束
Loading...