首先,先搭建一个redis集群,搭建redis集群的教程
连接redis的集群有多个API,但因为平时使用的都是Spring的redisTemplate,所以我们使用redisTemplate连接redis集群。
直接上代码,如果你redis集群搭的没毛病,贴上代码,就能操作redis集群。代码目录如下
文章目录
1、maven配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
<relativePath/>
</parent>
<groupId>org.example</groupId>
<artifactId>redisClusterTest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>redisClusterTest</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
</dependencies>
</project>
2、redis集群配置
spring:
redis:
timeout: 5000
database: 0
cluster:
nodes: 公网ip:7001,公网ip:7002,公网ip:7003,公网ip:7004,公网ip:7005,公网ip:7006
max-redirects: 3
jedis:
pool:
max-active: 8
max-wait: 10000
max-idle: 8
min-idle: 0
3、redis集群配置类
@Configuration
public class RedisConfiguration {
@Autowired
private ObjectMapper objectMapper;
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 使用Jackson2JsonRedisSerialize 替换默认的jdkSerializeable序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
4、验证redisTemplate操作的确实是集群
4.1、向集群写入一个键值对
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class, webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class AppTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testApp() {
redisTemplate.opsForValue().set("testKey","testValue");
}
}
4.2、登录redis集群,查看测试代码写入的键值对
[root@hcss-ecs-858f src]# ./redis-cli -c -h 127.0.0.1 -p 7001
127.0.0.1:7001> get testKey
"\"testValue\""
5、遇到的问题
5.1、问题一
报错:no reachable node in cluster
原因:创建redis集群时,没有使用公网ip创建
5.2、问题二
报错:org.springframework.data.redis.toomanyclusterredirectionsexception no more cluster attempts left
原因:创建redis集群时,没有使用公网ip创建