美文网首页
Redis 集群搭建

Redis 集群搭建

作者: 放开那个BUG | 来源:发表于2020-12-26 17:34 被阅读0次

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")));
       }
}

相关文章

网友评论

      本文标题:Redis 集群搭建

      本文链接:https://www.haomeiwen.com/subject/gcdgnktx.html