SpringBoot整合Redis集群

一、Windows下搭建Redis Cluster
下载Redis-Windows版本
https://github.com/microsoftarchive/redis/releases
下载后解压,目录如下:
SpringBoot整合Redis集群_第1张图片
1、集群节点目录:
拷贝开始下载的redis解压后的目录,并修改文件名(比如按集群下redis端口命名)如下:
SpringBoot整合Redis集群_第2张图片
在节点目录下新建文件,输入(举例在6380文件夹下新建文件)

title redis-6380;
redis-server.exe redis.windows.conf

保存为start.bat 下次启动时直接执行该脚本即可;
分别打开各个文件下的 redis.windows.conf,分别修改如下配置(举例修改6380文件下的redis.window.conf文件):

port 6380 //修改为与当前文件夹名字一样的端口号
appendonly yes //指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。 yes表示:存储方式,aof,将写操作记录保存到日志中
cluster-enabled yes //开启集群模式
cluster-config-file nodes-6380.conf  //保存节点配置,自动创建,自动更新(建议命名时加上端口号)
cluster-node-timeout 15000 //集群超时时间,节点超过这个时间没反应就断定是宕机

注意:在修改配置文件这几项配置时,配置项前面不能有空格,否则启动时会报错(参考下面)

其他文件节点 6381~6385也修改相应的节点配置信息和建立启动脚本

2、下载Ruby并安装
下载地址:https://rubyinstaller.org/downloads/
然后对ruby进行配置:
SpringBoot整合Redis集群_第3张图片
3、构建集群脚本redis-trib.rb

可以打开 https://raw.githubusercontent.com/antirez/redis/unstable/src/redis-trib.rb 然后复制里面的内容到本地并保存为redis-trib.rb; redis-trib.rb

与redis集群节点保存在同一个文件夹下,目录如下:
SpringBoot整合Redis集群_第4张图片

依次启动所有集群节点start.bat
然后cmd进入redis集群节点目录后,执行: (–replicas 1 表示为集群中的每个主节点创建一个从节点)
redis-trib.rb create --replicas 1 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

可能会遇见这个错误:
[ERR] Node is not empty. Either the node already knows other nodes (check with C

解决方法:
1)、将需要新增的节点下aof、rdb等本地备份文件删除;
2)、同时将新Node的集群配置文件删除,即:删除你redis.conf里面cluster-config-file所在的文件;
3)、再次添加新节点如果还是报错,则登录新Node,./redis-cli–h x –p对数据库进行清除:
172.168.63.201:7001> flushdb #清空当前数据库
参考:https://blog.csdn.net/vtopqx/article/details/50235737?spm=1001.2101.3001.6650.6&depth_1-

输出如下:
SpringBoot整合Redis集群_第5张图片
上图可看出 主节点为6380,6381,6382 端口的三个地址,6384,6385,6383为三个从节点
在这里插入图片描述
中途会询问是否打印更多详细信息,输入yes即可,然后redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯
SpringBoot整合Redis集群_第6张图片

4.测试集群
进入任意一个集群节点,cmd执行 redis-cli.exe -c -p 6381
写入任意一个value,查询
SpringBoot整合Redis集群_第7张图片
集群采用CRC16算法取模得到所属slot,然后将该key分到哈希槽区间的节点上CRC16(key) % 16384


二、SpringBoot架构整合

1、添加依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>2.9.0</version>
</dependency>

2、配置application.yml文件

spring:
	redis:
    	cache.clusterNodes: redis01.cloud.local:6379,redis02.cloud.local:6379,redis03.cloud.local:6379
    	cache.commandTimeout: 5000
    	password:
    	database: 0
    	lettuce:
      		pool:
        		max-active: 8
        		max-wait: -1
        		max-idle: 8
        		min-idle: 0

添加redis配置文件目录如下:
SpringBoot整合Redis集群_第8张图片
创建RedisProperties装载配置到对象

package com.example.datafile.common.utils;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "spring.redis.cache")
public class RedisProperties {
    private int expireSeconds;
    private String clusterNodes;
    private int commandTimeout;

    public int getExpireSeconds() {
        return expireSeconds;
    }

    public void setExpireSeconds(int expireSeconds) {
        this.expireSeconds = expireSeconds;
    }

    public String getClusterNodes() {
        return clusterNodes;
    }

    public void setClusterNodes(String clusterNodes) {
        this.clusterNodes = clusterNodes;
    }

    public int getCommandTimeout() {
        return commandTimeout;
    }

    public void setCommandTimeout(int commandTimeout) {
        this.commandTimeout = commandTimeout;
    }
}

创建JedisClusterConfig读取配置信息

package com.example.datafile.common.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

import java.util.HashSet;
import java.util.Set;

@Configuration
public class JedisClusterConfig {

    @Autowired
    private RedisProperties redisProperties;

    public JedisCluster getJedisCluster(){
        String [] serverArray=redisProperties.getClusterNodes().split(",");
        Set<HostAndPort> nodes=new HashSet<>();

        for (String ipPort:serverArray){
            String [] ipPortPair=ipPort.split(":");
            nodes.add(new HostAndPort(ipPortPair[0].trim(),Integer.valueOf(ipPortPair[1].trim())));

        }
        return  new JedisCluster(nodes,redisProperties.getCommandTimeout());
    }
}

创建RedisClientTemplate接口进行get 、set测试

package com.example.datafile.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class RedisClientTemplate {

    private static final Logger log = LoggerFactory.getLogger(RedisClientTemplate.class);

    @Autowired
    private JedisClusterConfig jedisClusterConfig;

    public boolean setToRedis(String key, Object value) {
        try {
            String str = jedisClusterConfig.getJedisCluster().set(key, String.valueOf(value));
            if ("OK".equals(str)) {
                return true;
            }
        } catch (Exception ex) {
            log.error("setToRedis:{Key:" + key + ",value" + value + "}", ex);
        }
        return false;
    }

    public Object getRedis(String key) {
        String str = null;
        try {
            str = jedisClusterConfig.getJedisCluster().get(key);
        } catch (Exception ex) {
            log.error("getRedis:{Key:" + key + "}", ex);
        }
        return str;
    }
}

写测试类测试:

package com.example.datafile;

import com.example.datafile.common.utils.RedisClientTemplate;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
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;

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {

    @Autowired
    private RedisClientTemplate redisClientTemplate;


    @Test
    public void set(){
        redisClientTemplate.setToRedis("Frank","Frank测试redis");
        System.out.println(redisClientTemplate.getRedis("Frank"));
        String traceId = TraceContext.traceId();
        System.out.println(traceId);
    }
}

打印:
SpringBoot整合Redis集群_第9张图片

你可能感兴趣的:(后端,redis,spring,boot,数据库)