redis集群模式连接代码
我封装了一个builder,可以直接使用
配置项的值在application.properties里package com.yunsheng.redisdemo;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.Protocol;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* yunsheng
*/
@Component
public class RedisClusterBuilder {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
//形如 ip1:port1,ip2:port2,ip3:port3
@Value("${spring.redis.cluster.nodes}")
private String nodes;
/**
* jedis对象池配置
*/
private GenericObjectPoolConfig jedisPoolConfig;
/**
* jedis集群对象
*/
private JedisCluster jedisCluster;
/**
* jedis连接超时(单位:毫秒)
*/
private int connectionTimeout = Protocol.DEFAULT_TIMEOUT;
/**
* jedis读写超时(单位:毫秒)
*/
private int soTimeout = Protocol.DEFAULT_TIMEOUT;
/**
* 节点定位重试次数:默认3次
*/
private int maxRedirections = 5;
/**
* 构建锁
*/
private final Lock lock = new ReentrantLock();
/**
* 构造函数package访问域,package外不能直接构造实例;
*
*/
RedisClusterBuilder() {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(GenericObjectPoolConfig.DEFAULT_MAX_TOTAL * 5);
poolConfig.setMaxIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE * 2);
poolConfig.setMinIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE);
//JedisPool.borrowObject最大等待时间
poolConfig.setMaxWaitMillis(1000L);
poolConfig.setJmxNamePrefix("jedis-pool");
poolConfig.setJmxEnabled(true);
this.jedisPoolConfig = poolConfig;
}
public JedisCluster build(String passwd) {
if (jedisCluster == null) {
try {
lock.tryLock(10, TimeUnit.SECONDS);
if (jedisCluster != null) {
return jedisCluster;
}
Set<HostAndPort> nodeList = new HashSet<HostAndPort>();
String[] nodeArray = this.nodes.split(",");
for (String node : nodeArray) {
String[] ipAndPort = node.split(":");
if (ipAndPort.length < 2) {
continue;
}
String ip = ipAndPort[0];
int port = Integer.parseInt(ipAndPort[1]);
nodeList.add(new HostAndPort(ip, port));
}
if (StringUtils.isBlank(passwd)){
jedisCluster = new JedisCluster(nodeList, connectionTimeout, soTimeout, maxRedirections, jedisPoolConfig);
}else {
jedisCluster = new JedisCluster(nodeList, connectionTimeout, soTimeout, maxRedirections,passwd, jedisPoolConfig);
}
return jedisCluster;
} catch (Throwable e) {
logger.error(e.getMessage(), e);
} finally {
lock.unlock();
}
return null;
} else {
return jedisCluster;
}
}
}
测试代码:package com.yunsheng.redisdemo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisCluster;
@RestController
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
@Autowired
RedisClusterBuilder redisClusterBuilder;
@RequestMapping("/set/{key}/{value}")
public String set(@PathVariable(name = "key") String key, @PathVariable(name = "value") String value) {
JedisCluster redisCluster =redisClusterBuilder.build(null);
redisCluster.set(key, value);
return "done";
}
@RequestMapping("/show/{key}")
public String show(@PathVariable(name = "key") String key){
JedisCluster redisCluster =redisClusterBuilder.build(null);
String result = redisCluster.get(key);
return result;
}
}
留言与评论(共有 0 条评论) |