- 第七步:在RedisCluster文件下执行命令构建集群
docker-compose up -d
- 第八步:测试
# 进入7901容器 docker exec -it redis-7901 bash # 连接7901节点 redis-cli -c -p 7901 -a 123456 # 查看集群信息 cluster info # 查看当前Redis节点 info replication # 查看当前节点槽位 cluster nodes
- 注意:要保证节点STATUS都是"Up XX seconds"才算成功
六.Java操作RedisCluster
1.概述
- Redis目前Java中最火热的三个客户端都是可以操作RedisCluster:Jedis、Redisson、Lettuce
- SpringBoot高版本中将spring-boot-starter-data-redis默认客户端从Jedis替换到了Lettuce,所以如果我们想要使用JedisCluster,那么需要移除Lettuce依赖,并引入Jedis依赖
- 本文以SpringBoot中的JedisCluster集成进入RedisTemplate为例,演示Java当中如何使用JedisCluster操作RedisCluster
- RedisTemplate: Spring对Redis操作的一层封装,高版本中底层是通过Lettuce实现的
- 核心配置对象:SpringBoot项目会自动读取配置并为我们创建,所以我们只需要使用即可
- JedisPoolConfig:用于配置连接池,包括最大连接数、最大空闲连接数、连接超时时间等等。连接池的作用是避免频繁创建和关闭连接,提高连接复用率和性能
- RedisClusterConfiguration:用于配置Redis Cluster各个节点的信息,包括节点的IP地址和端口号
- JedisConnectionFactory:连接工厂,它继承自RedisConnectionFactory,可以通过传入JedisPoolConfig和RedisClusterConfiguration来创建连接
- RedisTemplate:它是一个泛型类,可以指定键和值的类型。通过JedisConnectionFactory创建出RedisTemplate Bean后,就可以通过它来进行各种Redis操作,如get、set、incr、zadd等等
- 默认情况下,RedisTemplate使用的是JdkSerializationRedisSerializer进行序列化,这种序列化方式不易读取并且会出现乱码。为了解决这个问题,可以使用其他序列化方式,如Jackson和Fastjson
2.实战
- 第一步:创建一个Maven工程
- 第二步:导入依赖
<!--SpringBoot父依赖--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.2</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <!--排除默认的lettuce-core客户端依赖--> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <!--引入Jedis客户端依赖--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.6.1</version> </dependency> <!--jackson依赖--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.7.1</version> </dependency> <!--SpringBoot测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
- 第三步:创建配置文件
server: port: 8080 spring: redis: timeout: 5000 # 超时时间 database: 0 # 默认连接那个库 cluster: # 集群节点Ip+Port,多个以逗号隔开 nodes: - 127.0.0.1:6379 - 127.0.0.1:6380 - 127.0.0.1:6381 - 127.0.0.1:6382 - 127.0.0.1:6383 - 127.0.0.1:6384 max-redirects: 3 # 重定向最大次数 jedis: pool: # jedis连接池配置 max-active: 8 # 连接池中最大的活跃连接数,即同时能从连接池中获取的最大连接数 max-wait: -1 # 当连接池中没有可用连接时,调用者最大阻塞等待时间(单位为毫秒),超过这个时间后将抛出异常,-1为无限等待 max-idle: 8 # 连接池中最大的空闲连接数,即连接池中最多能保持多少个空闲连接,超过这个数目的空闲连接将被释放 min-idle: 0 # 接池中最小的空闲连接数,即连接池中保持的最少的空闲连接数,如果空闲连接数小于这个数目且总连接数小于 max-active,连接池就会创建新的连接 password: 123456 # 配置连接密码
- 第四步:自定义创建RedisTemplate实例化对象
package cn.neuronet.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfiguration extends CachingConfigurerSupport { @Autowired private RedisConnectionFactory factory; @Bean public RedisTemplate<String, Object> redisTemplate() { // 1.创建一个key是String,value是Object类型的RedisTemplate,使用时类型必须对应 RedisTemplate<String, Object> template = new RedisTemplate<>(); // 2.JedisConnectionFactory会使用RedisClusterConfiguration和JedisPoolConfig对象来创建JedisCluster连接池 template.setConnectionFactory(factory); // 3.创建一个Jackson2JsonRedisSerializer对象,指定需要序列化和反序列化的对象类型为Object类型,替换默认的jdkSerializeable序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); // 4.创建ObjectMapper对象,用于设置访问属性和默认类型 ObjectMapper om = new ObjectMapper(); // 5.设置所有访问属性可见,同时将对象的类型信息一起序列化到JSON串中 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); // 6.将ObjectMapper对象设置到Jackson2JsonRedisSerializer中 jackson2JsonRedisSerializer.setObjectMapper(om); // 7.用于序列化Redis中的String类型的数据。它是RedisTemplate的默认key序列化器,将Rediskey从String类型序列化为字节数组,以便于存储到Redis中 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // 8.String数据类型的Key采用String的序列化方式 template.setKeySerializer(stringRedisSerializer); // 9.Hash数据类型的key也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); // 10.String数据类型的value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // 11.Hash数据类型的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
- 第五步:测试
package cn.neuronet; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.test.context.junit4.SpringRunner; /** * @Author: Neuronet * @Date: 2023-04-23 * @Description: RedisCluster集群测试 * @Version:1.0 */ @SpringBootTest public class RedisClusterTest { @Autowired private RedisTemplate<String, Object> redisTemplate; @Test public void test() throws Exception{ redisTemplate.opsForValue().set("neuronet", "稀土掘金"); Object neuronetStr = redisTemplate.opsForValue().get("neuronet"); System.out.println(neuronetStr); } }
- 第七步:由于原生RedisTemplate方法在开发时会感觉到使用不便,所以通常来说项目中都会对RedisTemplate再次进行封装