1. 引入pom
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
2. 实现自动配置导入
2.1 定义yml内容
redis:
cluster:
nodes: 192.168.1.47:8082,192.168.1.47:8083,192.168.1.47:8084,192.168.1.47:8085,192.168.1.47:8086,192.168.1.47:8087
node: 192.168.1.21
port: 6379
password: tina1002
timeout: 2000
database: 1
maxIdle: 10
minIdle: 10
maxTotal: 20
maxAttempts: 5
2.2 定义导入类
@Data
public class RedisConfig {
//node address
private Set<String> nodes;
private String node;
//port for redis
private Integer port;
//password for redis
private String password;
private Integer timeout;
private Integer database;
private Integer maxIdle;
private Integer minIdle;
private Integer maxTotal;
private Integer maxAttempts;
}
2.3 定义属性类
@Data
@ConfigurationProperties(prefix = "redis.cluster")
public class RedisConfigProperty {
//node address
private Set<String> nodes;
private String node;
//port for redis
private Integer port;
//password for redis
private String password;
private Integer timeout;
private Integer database;
private Integer maxIdle;
private Integer minIdle;
private Integer maxTotal;
private Integer maxAttempts;
}
2.4 自动导入设置
@Configuration
@EnableConfigurationProperties(RedisConfigProperty.class)
@ConditionalOnClass(RedisConfig.class)
@ConditionalOnProperty(prefix = "redis.cluster", value = "", matchIfMissing = true)
public class RedisAutoConfig {
@Autowired
private RedisConfigProperty redisConfigProperty;
@Bean
public RedisConfig redisConfig(){
RedisConfig redisConfig = new RedisConfig();
redisConfig.setNodes(redisConfigProperty.getNodes());
redisConfig.setNode(redisConfigProperty.getNode());
redisConfig.setPort(redisConfigProperty.getPort());
redisConfig.setPassword(redisConfigProperty.getPassword());
redisConfig.setDatabase(redisConfigProperty.getDatabase());
redisConfig.setTimeout(redisConfigProperty.getTimeout());
redisConfig.setMaxTotal(redisConfigProperty.getMaxTotal());
redisConfig.setMinIdle(redisConfigProperty.getMinIdle());
redisConfig.setMaxIdle(redisConfigProperty.getMaxIdle());
redisConfig.setMaxAttempts(redisConfigProperty.getMaxAttempts());
return redisConfig;
}
2.5 实现单机和集群代码
@Configuration
public class RedisServer {
@Autowired
private RedisConfig redisConfig;
@Bean
public JedisCluster redisCluster() {
if (CollectionUtils.isEmpty(redisConfig.getNodes())) {
throw new RuntimeException();
}
// 设置redis集群的节点信息
Set<HostAndPort> nodes = redisConfig.getNodes().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(redisConfig.getMaxTotal());
jedisPoolConfig.setMaxIdle(redisConfig.getMaxIdle());
jedisPoolConfig.setMinIdle(redisConfig.getMinIdle());
// 创建jediscluster,传入节点列表和连接池配置
//JedisCluster cluster = new JedisCluster(nodes, jedisPoolConfig);
JedisCluster cluster = new JedisCluster(nodes,redisConfig.getTimeout(),redisConfig.getTimeout()
,redisConfig.getMaxAttempts(),redisConfig.getPassword(),jedisPoolConfig);
System.out.println("cluster=="+cluster);
return cluster;
}
@Bean
public Jedis jedis() {
// 配置连接池
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(redisConfig.getMaxTotal());
jedisPoolConfig.setMaxIdle(redisConfig.getMaxIdle());
jedisPoolConfig.setMinIdle(redisConfig.getMinIdle());
JedisPool pool = new JedisPool(jedisPoolConfig, redisConfig.getNode(), redisConfig.getPort(),
redisConfig.getTimeout(), redisConfig.getPassword(), redisConfig.getDatabase());
System.out.println("pool=="+pool.getResource());
return pool.getResource();
}
}
2.6 测试功能
@Test
public void test() {
System.out.println("redisConfig=="+redisConfig);
jedis.set("jedis","1222");
String j = jedis.get("jedis");
System.out.println("jedis==="+j);
jedisCluster.set("jedisCluster","121312");
String jc = jedisCluster.get("jedisCluster");
System.out.println("jedisCluster=="+jc);
}
测试结果