spring boot3 redis 多个数据源

spring:
  data:
    redis:
      database: 8
      host: localhost
      # password: tyhfJHYG$%^
      port: 6379
      timeout: 60000
      lettuce:
        pool:
          max-active: 1500
          max-idle: 300
          max-wait: -1ms
          min-idle: 0
    redis2:
      database: 0
      host: localhost
      port: 6379
      password:
package com.ys.conf;


import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.support.spring6.data.redis.GenericFastJsonRedisSerializer;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.SerializationException;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;


/**
 * @author kong
 * redis 缓存配置
 */
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConf {

    @Value("${spring.data.redis2.database}")
    private Integer redis2DataBase;
    @Value("${spring.data.redis2.host}")
    private String redis2Localhost;
    @Value("${spring.data.redis2.port}")
    private Integer redis2Port;
    @Value("${spring.data.redis2.password}")
    private String redis2Password;

    @Value("${spring.data.redis.timeout}")
    private Integer timeout;
    @Value("${spring.data.redis.lettuce.pool.max-active}")
    private Integer maxActive;
    @Value("${spring.data.redis.lettuce.pool.max-idle}")
    private Integer maxIdle;
    @Value("${spring.data.redis.lettuce.pool.max-wait}")
    private String maxWait;
    @Value("${spring.data.redis.lettuce.pool.min-idle}")
    private Integer minIdle;

    @Bean("redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        GenericFastJsonRedisSerializer fastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
        template.setDefaultSerializer(fastJsonRedisSerializer);

        //解决fastjson2 redis key 序列话多双引号问题
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);

        FastRedisSerializer fastRedisSerializer = new FastRedisSerializer();
        template.setHashValueSerializer(fastRedisSerializer);
        return template;
    }

    @Bean("redis2")
    public StringRedisTemplate redis2Template() {
        return createStringRedisTemplate(this.redis2Localhost, this.redis2Port, this.redis2Password, this.redis2DataBase);
    }


    public StringRedisTemplate createStringRedisTemplate(String host, int port, String password, int database) {
        // 基本配置
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
        configuration.setHostName(host);
        configuration.setPort(port);
        configuration.setDatabase(database);
        if (ObjectUtils.isNotEmpty(password)) {
            RedisPassword redisPassword = RedisPassword.of(password);
            configuration.setPassword(redisPassword);
        }

        // 连接池通用配置
        GenericObjectPoolConfig<?> genericObjectPoolConfig = new GenericObjectPoolConfig<>();
        genericObjectPoolConfig.setMaxTotal(maxActive);
        genericObjectPoolConfig.setMinIdle(minIdle);
        genericObjectPoolConfig.setMaxIdle(maxIdle);
        genericObjectPoolConfig.setMaxWait(Duration.ofMillis(60000));

        // Lettuce Pool
        LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
        builder.poolConfig(genericObjectPoolConfig);
        builder.commandTimeout(Duration.ofSeconds(timeout));
        LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build());
        connectionFactory.afterPropertiesSet();

        StringRedisTemplate redisTemplate = new StringRedisTemplate();
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }


}

class FastRedisSerializer extends GenericFastJsonRedisSerializer {
    @Override
    public byte[] serialize(Object object) throws SerializationException {
        if (object == null) {
            return new byte[0];
        }
        //处理hash value 存储 无法执行自增
        if (object instanceof Number) {
            return JSON.toJSONBytes(object);
        }
        return super.serialize(object);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值