1、步骤
redis 集群搭建还是挺简单的,假设我们已经下载编译好了 redis,我们只需要为每台集群搞一份 redis.conf 配置即可,配置内容如下:
port 9001(每个节点的端口号)
bind 192.168.119.131(绑定当前机器 IP,如果自己本地搭建,不用配这个选项)
cluster-enabled yes(启动集群模式)
cluster-config-file nodes9001.conf(9001和port要对应)
cluster-node-timeout 15000
appendonly yes
配置好之后,分别启动每个实例,比如启动我自己的配置文件:

启动完毕之后,然后让各个单独的机器组成集群,6台机器变成三主三从的模式。
- redis-cli --cluster create 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 --cluster-replicas 1
然后以集群的方式连接即可:
- redis-cli -c -h ip -p port 。端口随便选其中的一个。
2、springbooot 连接
首先是建立一个 springboot 项目,在 pom.xml 文件引入客户端,无论是 springboot 自带的 redisTemplate 还是 jedis 都可,这里引入 jedis。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
然后在 application.properties 里配置集群地址:
# redis集群的节点信息
redis.cluster.nodes=127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6382,127.0.0.1:6383,127.0.0.1:6384,127.0.0.1:6385
# redis连接池的配置
redis.cluster.pool.max-active=8
redis.cluster.pool.max-idle=5
redis.cluster.pool.min-idle=3
然后在项目中直接配置 redis 即可。
package com.redis.clustertest.config;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
@Configuration
public class RedisClusterConfig {
private static final Logger log = LoggerFactory.getLogger(RedisClusterConfig.class);
@Value("${redis.cluster.nodes}")
private String redisNodesStr;
@Value("${redis.cluster.pool.max-active}")
private int maxTotal;
@Value("${redis.cluster.pool.max-idle}")
private int maxIdle;
@Value("${redis.cluster.pool.min-idle}")
private int minIdle;
// 初始化redis配置
@Bean
public JedisCluster redisCluster() {
if (StringUtils.isEmpty(redisNodesStr)) {
throw new RuntimeException();
}
String[] redisNodes = redisNodesStr.split(",");
// 设置redis集群的节点信息
Set<HostAndPort> nodes = Arrays.asList(redisNodes).stream().map(node -> {
String[] nodeInfo = node.split(":");
if (nodeInfo.length == 2) {
return new HostAndPort(nodeInfo[0], Integer.parseInt(nodeInfo[1]));
} else {
return new HostAndPort(nodeInfo[0], 6379);
}
}).collect(Collectors.toSet());
// 配置连接池
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxTotal);
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMinIdle(minIdle);
// 创建jediscluster,传入节点列表和连接池配置
JedisCluster cluster = new JedisCluster(nodes, jedisPoolConfig);
log.info("finish jedis cluster initailization");
return cluster;
}
}
然后就可以愉快的使用 redis 了。在这里有一个小插曲,我一直在在 jedisCluster 的 set nx ex 的命令,但是一直没找到,直到发现还能这样用。。。
package com.redis.clustertest;
import com.redis.clustertest.utils.RedisUtil;
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 redis.clients.jedis.JedisCluster;
import redis.clients.jedis.params.SetParams;
import java.util.Collections;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisClusterTest{
@Autowired
private JedisCluster redisCluster;
@Autowired
private RedisUtil redisUtil;
private final String DISTRIBUTE_LOCK_SCRIPT_UNLOCK_VAL = "if" +
" redis.call('get', KEYS[1]) == ARGV[1]" +
" then" +
" return redis.call('del', KEYS[1])" +
" else" +
" return 0" +
" end";
@Test
public void getValue(){
SetParams setParams = new SetParams();
setParams.nx().ex(333);
System.out.println(redisCluster.set("pp", "222", setParams));
System.out.println(redisCluster.set("pp", "333", setParams));
System.out.println(redisCluster.eval(DISTRIBUTE_LOCK_SCRIPT_UNLOCK_VAL, Collections.singletonList("pp"), Collections.singletonList("22")));
System.out.println(redisCluster.eval(DISTRIBUTE_LOCK_SCRIPT_UNLOCK_VAL, Collections.singletonList("pp"), Collections.singletonList("222")));
}
}
网友评论