SpringBoot整合redis集群

前言

有些场景,我们可能会搭建redis集群;而在不同的redis配置中存放不同的数据信息,但是我们需要将这两部分的数据一起查询出来,合并一起,这样我们应该怎么操作呢?废话不多说,直接上demo:

依赖:pom

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.6.1</version> <!-- 版本号可能会有更新 -->
</dependency>

配置文件:redis.yml

spring:
  redis:
    cluster:
      nodes: #集群节点
        192.168.0.10:18080,
        192.168.0.11:18081,
        192.168.0.12:18082,
        192.168.0.21:18180,
        192.168.0.22:18181,
        192.168.0.23:18182

redis类

用于读取配置文件,以及加载不同的ip和端口

package com.willfar.pdp.util;

import lombok.extern.slf4j.Slf4j;
import org.yaml.snakeyaml.Yaml;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
public class RedisClusterUtil {

    public static List<String> readRedisNodesFromYaml() throws FileNotFoundException {
        // 读取YAML文件
        Yaml yaml = new Yaml();
        // 从文件加载YAML数据
        File file = new File("redis-demo\\BOOT-INF\\classes\\redis.yml");
        InputStream inputStream = new FileInputStream(file);
        Map<String, Object> yamlData = yaml.load(inputStream);
        // 解析节点信息
        String nodes = "";
        if (yamlData.containsKey("spring") && yamlData.get("spring") instanceof Map) {
            Map<String, Object> springConfig = (Map<String, Object>) yamlData.get("spring");
            if (springConfig.containsKey("redis") && springConfig.get("redis") instanceof Map) {
                Map<String, Object> redisConfig = (Map<String, Object>) springConfig.get("redis");
                if (redisConfig.containsKey("cluster") && redisConfig.get("cluster") instanceof Map) {
                    Map<String, Object> clusterConfig = (Map<String, Object>) redisConfig.get("cluster");
                    if (clusterConfig.containsKey("nodes") && clusterConfig.get("nodes") instanceof String) {
                        nodes = clusterConfig.get("nodes").toString();
                    }
                }
            }
        }
        // 使用正则表达式匹配 IP:端口 格式的字符串
        String pattern = "(\\d+\\.\\d+\\.\\d+\\.\\d+):(\\d+)";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(nodes);
        List<String> nodeList = new ArrayList<>();
        // 提取匹配到的 IP:端口 字符串
        while (m.find()) {
            String node = m.group(1) + ":" + m.group(2);
            nodeList.add(node);
        }

        return nodeList;
    }

    public static JedisCluster createJedisCluster(List<String> nodes) {
        // 创建JedisCluster连接到选定的节点
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(100);
        poolConfig.setMaxIdle(20);
        poolConfig.setMinIdle(10);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(true);
        poolConfig.setTestWhileIdle(true);

        Set<HostAndPort> jedisClusterNodes = new HashSet<>();
        for (String node : nodes) {
            String[] parts = node.split(":");
            jedisClusterNodes.add(new HostAndPort(parts[0], Integer.parseInt(parts[1])));
        }
        return new JedisCluster(jedisClusterNodes,1000,1000,5,"reidsPassword", poolConfig);
    }
}

使用

public List<Object> getValues(int redisType) throws FileNotFoundException {
        List<Object> result = new ArrayList<>();
        // 读取YAML文件中的Redis集群节点信息
        List<String> nodes = RedisClusterUtil.readRedisNodesFromYaml();

        List<String> strings1 = nodes.subList(0, Math.min(nodes.size(), 3));
        // 创建JedisCluster连接到选定的节点
        JedisCluster jedisCluster1 = RedisClusterUtil.createJedisCluster(strings1);
        // 如果redis类型等于1则使用前三个ip+端口
        if(redisType == 1) {
            Object value = jedisCluster1.get(key);
            result.add(value);
        }
        jedisCluster1.close();


        List<String> strings2 = nodes.subList(3, Math.min(nodes.size(), 6));
        // 创建JedisCluster连接到选定的节点
        JedisCluster jedisCluster2 = RedisClusterUtil.createJedisCluster(strings2);
        // 如果redis类型等于0则使用后三个ip+端口
        if(redisType == 0) {
            Object value = jedisCluster2.get(key);
            result.add(value);
         }

         // 关闭 Jedis Cluster 连接
         jedisCluster2.close();
        
        return result;
}

这样就完成了,快使用起来吧。

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Spring Boot整合Redis集群的步骤: 1. 添加Redis依赖:在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 配置Redis集群节点:在application.properties或application.yml文件中配置Redis集群节点的信息,例如: ```yaml spring.redis.cluster.nodes=192.168.0.1:6379,192.168.0.2:6379,192.168.0.3:6379 ``` 3. 配置Redis连接池:可以根据需要配置Redis连接池的相关参数,例如最大连接数、最大空闲连接数等。以下是一个示例配置: ```yaml spring.redis.jedis.pool.max-active=100 spring.redis.jedis.pool.max-idle=10 spring.redis.jedis.pool.min-idle=5 spring.redis.jedis.pool.max-wait=3000 ``` 4. 创建RedisTemplate Bean:在配置类中创建RedisTemplate Bean,用于操作Redis集群。以下是一个示例配置: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } } ``` 5. 使用RedisTemplate操作Redis集群:在需要使用Redis的地方,注入RedisTemplate,并使用其提供的方法操作Redis集群。以下是一个示例: ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public void setValue(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object getValue(String key) { return redisTemplate.opsForValue().get(key); } ``` 这样就完成了Spring BootRedis集群整合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值