前言

有些场景,我们可能会搭建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;
}

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐