代码分享,redis集群模式的java代码

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 条评论)
   
验证码:

相关文章

推荐文章

'); })();