springboot连接redis(兼顾 Redis 单机、Redis Cluster 和 Redis Sentinel)

springboot连接redis

  • 一、Maven 依赖
  • 二、application.properties 配置文件
  • 三、Redis 配置类
  • 四、使用 RedisTemplate

springboot连接redis可以使用 org.springframework.data.redis.core.RedisTemplate 来管理Redis 数据库,该类可以同时兼顾 Redis 单机、Redis Cluster 和 Redis Sentinel。

一、Maven 依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-redisartifactId>
    dependency>

    <dependency>
        <groupId>redis.clientsgroupId>
        <artifactId>jedisartifactId>
    dependency>

    <dependency>
        <groupId>io.lettucegroupId>
        <artifactId>lettuce-coreartifactId>
    dependency>

    <dependency>
        <groupId>org.apache.commonsgroupId>
        <artifactId>commons-pool2artifactId>
    dependency>

    
    <dependency>
        <groupId>org.springframework.datagroupId>
        <artifactId>spring-data-redisartifactId>
    dependency>
dependencies>

二、application.properties 配置文件

# Redis 单机模式
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0

# Redis Cluster 模式
# 如果您使用的是 Redis Cluster,请将集群节点的 IP 地址和端口号使用逗号分隔起来
# 如:192.168.0.100:7000,192.168.0.101:7000,192.168.0.102:7000
spring.redis.cluster.nodes=

# Redis Sentinel 模式
# 如:127.0.0.1:26379,127.0.0.2:26380
spring.redis.sentinel.nodes=
spring.redis.sentinel.master=

三、Redis 配置类

@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Value("${spring.redis.password}")
    private String redisPassword;

    @Value("${spring.redis.cluster.nodes}")
    private String redisClusterNodes;

    @Value("${spring.redis.sentinel.nodes}")
    private String redisSentinelNodes;

    @Value("${spring.redis.sentinel.master}")
    private String redisSentinelMaster;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        if (StringUtils.isEmpty(redisClusterNodes) && StringUtils.isEmpty(redisSentinelNodes)) {
            // Redis 单机模式
            RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(redisHost, redisPort);
            config.setPassword(RedisPassword.of(redisPassword));
            return new JedisConnectionFactory(config);
        }

        if (StringUtils.isNotEmpty(redisClusterNodes)) {
            // Redis Cluster 模式
            RedisClusterConfiguration config = new RedisClusterConfiguration(Arrays.asList(redisClusterNodes.split(",")));
            config.setPassword(RedisPassword.of(redisPassword));
            return new LettuceConnectionFactory(config);
        }

        if (StringUtils.isNotEmpty(redisSentinelNodes)) {
            // Redis Sentinel 模式
            RedisSentinelConfiguration config = new RedisSentinelConfiguration()
                    .master(redisSentinelMaster)
                    .sentinels(Arrays.stream(redisSentinelNodes.split(",")).map(x -> new RedisNode(x.split(":")[0], Integer.parseInt(x.split(":")[1]))).collect(Collectors.toSet()));
            config.setPassword(RedisPassword.of(redisPassword));
            return new JedisConnectionFactory(config);
        }

        throw new RuntimeException("Redis 配置不正确");
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory());
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }

    @Bean
    public StringRedisTemplate stringRedisTemplate() {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory());
        return template;
    }
}

  在上面的代码中,我们定义了 redisConnectionFactory() 方法来返回适当的 Redis Connection Factory 对象。如果 spring.redis.cluster.nodes 属性不为空,则使用 Redis Cluster 模式。如果 spring.redis.sentinel.nodes 属性不为空,则使用 Redis Sentinel 模式。否则,使用 Redis 单机模式。
  在 redisTemplate() 和 stringRedisTemplate() 方法中,我们使用构造方法注入 RedisConnectionFactory,同时对键和值进行序列化和反序列化。

四、使用 RedisTemplate

现在,您可以注入 redisTemplate 或 stringRedisTemplate 来开始与 Redis 进行交互。

@Service
public class RedisService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    public RedisTemplate redisTemplate;

}

由此,基本连接方式已解决,如有任何问题欢迎探讨交流。

你可能感兴趣的:(springboot,redis,spring,boot,java)