Java研究院 Java研究院

人非生而知之者,知之,而后知不知。

目录
SpringBoot集成基于Docker搭建的RedisCluster集群并验证
/        

SpringBoot集成基于Docker搭建的RedisCluster集群并验证 置顶!

本文承接前文 手把手教你于docker 搭建 redis-cluster 集群并验证 以及 自定义注解式切面不生效?看完这篇你就明白了!一文。

在前文中,我们已经有了基于docker搭建的redis集群,本文主要讲述Springboot集成redis集群,并实现查询操作。

首先需要一个项目,本文借助之前讲AOP的项目来讲,当然也可以新建一个项目。

Springboot集成redis,那就必须要用到redis的依赖,本文以连接池的方式来介绍。

Springboot官方集成的连接池用的是lettuce,但是不好用,所以我们用jedis来做。

引入依赖

这里要用的依赖主要是redis和连接池。

implementation ('org.springframework.boot:spring-boot-starter-data-redis'){
        exclude group: "io.lettuce"
    }
    implementation group: 'org.apache.commons', name: 'commons-pool2', version: '2.6.2'

    implementation group: 'redis.clients', name: 'jedis', version: '3.6.3'

项目用的gradle来打包,用maven的话只是写法不一样,相信你能看到。主要是排除了io.lettuce 并且引入; jedis和common-pool,这也是阿里推荐的做法。

配置Redis

使用 SpringBoot 的好处是,你只需要在配置文件中配置好信息,就能自动注入,在引入上前述依赖的情况下,你只需要在你的 application.yml 文件中增加如下配置,就可以使用redis了。

spring:
  redis:
    jedis:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0
    timeout: 5000 #连接超时时间
    cluster:
      max-redirects: 5 #连接失败最大重连次数
      nodes: # 集群节点
        - 10.0.4.6:6379
        - 10.0.4.6:6380
        - 10.0.4.6:6381
        - 10.0.4.6:6382
        - 10.0.4.6:6383
        - 10.0.4.6:6384

注意,我这里项目的配置信息在 bootstarp.yml中。

为了保险起见,你可以写一个 redis 配置类,做个序列化,防止出现中文乱码。


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author xiaowei.yang
 * @date 2021-09-27
 * @description 类描述
 */
@Configuration
public class RedisConfig {
	@Autowired
	private RedisTemplate redisTemplate;

	/**
	 * 解决redis插入中文乱码
	 */
	@Bean
	public RedisTemplate redisTemplateInit() {
		//设置序列化Key的实例化对象
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		//设置序列化Value的实例化对象
		redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
		return redisTemplate;
	}
}

编写测试类

这里我在RedisService中写了两个方法,分别是根据key查询对应的value和查询某个节点下的所有key。

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.RedisClusterNode;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Set;

/**
 * @author xiaowei.yang
 * @date 2021-09-26
 * @description 类描述
 */
@Service
@Slf4j
public class RedisService {

	@Resource
	private RedisTemplate<String, Object> redisTemplate;

	public String getString(String key) {
		Object v = redisTemplate.opsForValue().get(key);
		return ObjectUtil.toString(v);
	}

	public String getKeys(int port) {
		RedisClusterNode node = new RedisClusterNode("10.0.4.6",port);
		Set<String> keys = redisTemplate.opsForCluster().keys(node,"*");
	
		return JSONUtil.toJsonStr(keys);
	}
}

测试

这里可以传入key查询对应的方法,同时可以通过传入端口来指定节点,查询对应的keys,请看图。

image.png

image.png

怎么做的set操作大家还记得吧?不记得的话看上文。

image.png

image.png

同样的,在前文讲述添加从节点备份的时候,我们将 6382、6383 端口节点作为 6379 端口节点的从节点,而6384 端口节点作为 6381 端口节点的从节点,两者存储的key是一样的。

学废了吗?欢迎留言。


标题:SpringBoot集成基于Docker搭建的RedisCluster集群并验证
作者:yxw839841231
地址:https://studying.icu/articles/2021/09/27/1632733293290.html