RedisConfig.java 4.92 KB
package com.infoloop.tianting.config;

import brave.Tracing;
import com.infoloop.tianting.tracing.RedisSpanCustomizer;
import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.resource.ClientResources;
import io.lettuce.core.tracing.BraveTracing;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;
import java.util.concurrent.TimeUnit;

import static com.infoloop.tianting.constant.ConfigConstants.ENTERPRISE_REDIS_CLIENT;
import static com.infoloop.tianting.constant.ConfigConstants.ENTERPRISE_REDIS_CONNECTION;
import static com.infoloop.tianting.constant.ConfigConstants.ENTERPRISE_REDIS_DATABASE;
import static com.infoloop.tianting.constant.ConfigConstants.ENTERPRISE_REDIS_PASSWORD;
import static com.infoloop.tianting.constant.ConfigConstants.ENTERPRISE_REDIS_URL;
import static com.infoloop.tianting.constant.ConfigConstants.REDISSON_CLIENT;
import static com.infoloop.tianting.constant.ConfigConstants.REDIS_CLIENT;
import static com.infoloop.tianting.constant.ConfigConstants.REDIS_CONNECTION;
import static com.infoloop.tianting.constant.ConfigConstants.REDIS_DATABASE;
import static com.infoloop.tianting.constant.ConfigConstants.REDIS_PASSWORD;
import static com.infoloop.tianting.constant.ConfigConstants.REDIS_PORT;
import static com.infoloop.tianting.constant.ConfigConstants.REDIS_URL;

@Configuration
public class RedisConfig {

    @Bean
    public ClientResources clientResources(@Autowired Tracing tracing) {
        final var redisTracing = BraveTracing.builder()
                .excludeCommandArgsFromSpanTags()
                .tracing(tracing)
                .spanCustomizer(new RedisSpanCustomizer())
                .build();
        return ClientResources.builder().tracing(redisTracing).build();
    }

    @Bean(REDIS_CLIENT)
    public RedisClient redisClient(@Value(REDIS_URL) final String url,
                                   @Value(REDIS_PASSWORD) final String auth,
                                   @Value(REDIS_DATABASE) final int dbToken,
                                   @Autowired ClientResources clientResources) {
        final var redisURIBuilder = RedisURI.builder()
                .withHost(url)
                .withTimeout(Duration.of(60, TimeUnit.SECONDS.toChronoUnit()))
                .withDatabase(dbToken);
        if (!auth.isEmpty()) {
            redisURIBuilder.withPassword(auth.toCharArray());
        }
        final var redisURI = redisURIBuilder.build();
        return RedisClient.create(clientResources, redisURI);
    }

    @Bean(REDISSON_CLIENT)
    public RedissonClient redissonClient(@Value(REDIS_URL) final String url,
                                         @Value(REDIS_PASSWORD) final String auth,
                                         @Value(REDIS_PORT) final String port,
                                         @Value(REDIS_DATABASE) final int dbToken) {
        final var config = new Config();
        config.setCodec(new JsonJacksonCodec());

        config.useSingleServer()
                .setAddress("redis://" + url + ":" + port)
                .setDatabase(dbToken);
        if (!auth.isEmpty()) {
            config.useSingleServer().setPassword(auth);
        }
        return Redisson.create(config);
    }

    @Bean(REDIS_CONNECTION)
    public StatefulRedisConnection<String, String> statefulRedisConnection(@Autowired @Qualifier(REDIS_CLIENT) RedisClient redisClient) {
        return redisClient.connect();
    }

    @Bean(ENTERPRISE_REDIS_CLIENT)
    public RedisClient enterpriseRedisClient(@Value(ENTERPRISE_REDIS_URL) final String url,
                                             @Value(ENTERPRISE_REDIS_PASSWORD) final String auth,
                                             @Value(ENTERPRISE_REDIS_DATABASE) final int dbToken,
                                             @Autowired ClientResources clientResources) {
        final var redisURIBuilder = RedisURI.builder()
                .withHost(url)
                .withTimeout(Duration.of(60, TimeUnit.SECONDS.toChronoUnit()))
                .withDatabase(dbToken);
        if (!auth.isEmpty()) {
            redisURIBuilder.withPassword(auth.toCharArray());
        }
        final var redisURI = redisURIBuilder.build();
        return RedisClient.create(clientResources, redisURI);
    }

    @Bean(ENTERPRISE_REDIS_CONNECTION)
    public StatefulRedisConnection<String, String> enterpriseStatefulRedisConnection(@Autowired @Qualifier(ENTERPRISE_REDIS_CLIENT) RedisClient enterpriseRedisClient) {
        return enterpriseRedisClient.connect();
    }
}