之前就在阿里云服务器上搭建了集群,但如何用Java访问到redis集群呢,肯定不是一个一个节点的访问,通过像是树干一样的接口来访问redis集群,但又不能每个访问redis集群的进程都生成一个新的cluster接口,所以这里选择单例模式来实现。
import org.jmqtt.common.config.StoreConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.util.LinkedHashSet;
import java.util.Set;
public class RedisStoreManager {
private StoreConfig redisConfig;
private Set<HostAndPort> nodes = new LinkedHashSet<HostAndPort>();
private JedisCluster cluster;
private JedisPoolConfig poolConfig = new JedisPoolConfig();
private volatile static RedisStoreManager INSTANCE ;
private RedisStoreManager(){
}
public static RedisStoreManager getInstance(StoreConfig redisConfig){
if (null == INSTANCE){
synchronized (RedisStoreManager .class){
if (null == INSTANCE){
INSTANCE = new RedisStoreManager(); //使用懒汉模式,只有在第一次访问的时候才创建实例
INSTANCE.redisConfig = redisConfig;
}
}
}
return INSTANCE;
}
public JedisCluster getCluster(){return cluster;}
public void initialization(){
poolConfig.setMaxTotal(redisConfig.getMaxActive());
poolConfig.setMaxIdle(redisConfig.getMaxIdle());
poolConfig.setMaxWaitMillis(redisConfig.getTimeout());
String[] clusterNodes = redisConfig.getNodes().split(";");
for (String node : clusterNodes){
nodes.add(new HostAndPort(node.split(":")[0],Integer.valueOf(node.split(":")[1])));
}
this.cluster = new JedisCluster(nodes,poolConfig);
}
}
在这里的单例中运用了双重检验锁,目的是为了防止创建多个实例而且不需要每次调用都要对对象上锁,极大提升效率。
只需要传入redis的配置信息例如节点地址和端口“127.0.0.1:7000;127.0.0.1:7001…”,maxIdle、Timeout等。详细的代码发布在我和同学一起做的一个项目JMQTT的GitHub上,传送门:https://github.com/Cicizz/jmqtt
JMQTT是用java语言开发的支持mqtt协议的高可用,高性能,高可扩展性的broker,采用netty作为通信层组件,支持插件化开发。在这个项目中我们用redis作为缓存,如果您觉得有帮助或者对我们的项目感兴趣,欢迎给我们的项目点个watch和star。