SpringBoot - Redis的整合与使用详解2(Redis集群)
作者:hangge | 2019-11-29 08:10
二、Redis 的整合与使用:Redis 集群
1,安装配置
(1)首先编辑 pom.xml 文件,添加相关依赖:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
(2)接着配置集群信息,我们在 resources 目录下创建一个 application.yml 配置文件,下面是 Spring Boot 1.x 版本的配置:
(1)由于本案例各个 Redis 实例的 host 都是一样的,因此这里只配置了一个 host,而 port 配置成了一个集合,这些 port 将被注入一个集合中。
(2)poolConfig 则是基本的连接池信息配置:
(2)poolConfig 则是基本的连接池信息配置:
- smax-active:表示 Redis 连接池的最大连接数
- max-idle:表示 Redis 连接池中的最大空闲连接数
- max-wait-millis:表示连接池的最大阻塞等待使用,默认为 -1,表示没有限制
- min-idle:表示连接池最小空闲连接数
spring:
redis:
cluster:
ports:
- 8001
- 8002
- 8003
- 8004
- 8005
- 8006
host: 192.168.60.133
poolConfig:
max-total: 8
max-idle: 8
max-wait-millis: -1
min-idle: 0
- 如果是 Spring Boot 2.x 或 3.x 版本则需要使用如下配置结构。spring.data.redis 是从 Spring Boot 2.x 版本开始引入的新的配置前缀,也用于配置 Redis 的相关参数。
spring: data: redis: database: 0 cluster: nodes: - 192.168.121.128:8001 - 192.168.121.128:8002 - 192.168.121.128:8003 - 192.168.121.128:8004 - 192.168.121.128:8005 - 192.168.121.128:8006 password: 123 jedis: pool: max-active: 8 max-idle: 8 max-wait: -1ms min-idle: 0
(3)不同与单机版 Redis 整合 Spring Boot,Redis 集群整合 Spring Boot 需要开发者手动配置。我们创建 RedisConfig,完成对 Redis 的配置:
@Configuration @ConfigurationProperties("spring.redis.cluster") public class RedisConfig { /** 通过 @ConfigurationProperties 注解声明配置文件前缀,将配置文件中定义的 ports 数组、host 及连接池配置信息都将被注入 port、host、poolConfig 三个属性中。 **/ List<Integer> ports; String host; JedisPoolConfig poolConfig; // 配置 RedisClusterConfiguration 实例 @Bean RedisClusterConfiguration redisClusterConfiguration() { RedisClusterConfiguration configuration = new RedisClusterConfiguration(); List<RedisNode> nodes = new ArrayList<>(); for (Integer port : ports) { nodes.add(new RedisNode(host, port)); } configuration.setPassword(RedisPassword.of("123")); // 设置 Redis 登录密码 configuration.setClusterNodes(nodes); // 设置 Redis 节点信息 return configuration; } // 根据 RedisClusterConfiguration 实例以及连接池配置信息创建 Jedis 连接工厂 JedisConnectionFactory @Bean JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory factory = new JedisConnectionFactory(redisClusterConfiguration(),poolConfig); return factory; } // 根据 JedisConnectionFactory 创建 RedisTemplate,同时配置 key 和 value 序列号方式。 @Bean RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); return redisTemplate; } // 根据 JedisConnectionFactory 创建 StringRedisTemplate,同时配置 key 和 value 序列号方式。 @Bean StringRedisTemplate stringRedisTemplate() { StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(jedisConnectionFactory()); stringRedisTemplate.setKeySerializer(new StringRedisSerializer()); stringRedisTemplate.setKeySerializer(new StringRedisSerializer()); return stringRedisTemplate; } public List<Integer> getPorts() { return ports; } public void setPorts(List<Integer> ports) { this.ports = ports; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public JedisPoolConfig getPoolConfig() { return poolConfig; } public void setPoolConfig(JedisPoolConfig poolConfig) { this.poolConfig = poolConfig; } }
2,使用样例
(1)首先创建一个 User 实体类,内容如下:@Getter @Setter @ToString public class User implements Serializable { private Integer id; private String name; private Integer age; }
(1) RedisTemplate 和 StringRedisTemplate 实例提供了 Redis 的基本操作方法,本次由我们自己提供:
- StringRedisTemplate 是 RedisTemplate 的子类,StringRedisTemplate 中的 key 和 value 都是字符串,采用的序列化方案是 StringRedisSerializer。
- RedisTemplate 则可以用来操作对象,RedisTemplate 采用的序列化方案是 JdkSerializationRedisSerializer。
@RestController public class HelloController { @Autowired RedisTemplate redisTemplate; //默认提供的用来操作对象的redis操作实例 @Autowired StringRedisTemplate stringRedisTemplate; //默认提供的用来操作字符串的redis操作实例 @RequestMapping("/test") public void test() { //保存一个字符串 ValueOperations<String, String> ops1 = stringRedisTemplate.opsForValue(); ops1.set("message", "欢迎访问 hangge.com"); //读取一个字符串 String message = ops1.get("message"); System.out.println("读取一个字符串:" + message); //保存一个对象 ValueOperations ops2 = redisTemplate.opsForValue(); User u1 = new User(); u1.setId(1); u1.setName("hangge"); u1.setAge(100); ops2.set("user", u1); //读取一个对象 User u2 = (User) ops2.get("user"); System.out.println("读取一个对象:" + u2.toString()); } }
(3)使用浏览器访问 http://localhost:8080/test,可以看到控制台输入如下:
(4)然后登录任意一个 Redis 实例,查询数据。可以看到查询时只要登录任意一个 Redis 实例,RedisCluster 会负责将查询请求 Redirected 到相应的实例上去。
全部评论(0)