SpringBoot整合redis集群
有些场景,我们可能会搭建redis集群;而在不同的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;
}
这样就完成了,快使用起来吧。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献4条内容
所有评论(0)