资讯详情

springboot 集成redis动态切换db库

直接上图 在这里插入图片描述 复制注意直接使用包路径 pom导包

  <!-- redis -->         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-data-redis</artifactId>         </dependency>         <dependency>             <groupId>redis.clients</groupId>             <artifactId>jedis</artifactId>         </dependency>         <dependency>             <groupId>com.fasterxml.jackson.datatype</groupId>             <artifactId>jackson-datatype-jsr310</artifactId>         </dependency> 

通过key计算出db

db总数 和存储位置 有些冗余可以自行删除 redis方法进行了一些封装

AbstractRedisConfig类

import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; importcom.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/** * @Description: TODO */
@Slf4j
public abstract class AbstractRedisConfig { 
       
    public int defaultDb = 0;

    public int totalDbs = 1;

    public Map<Integer, RedisTemplate<String, Object>> redisTemplateMap = new HashMap<>();

    private StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();

    abstract String getHost();
    abstract int getPort();
    abstract String getPassword();
    abstract int getMaxActive();
    abstract int getMaxIdle();
    abstract int getMinIdle();
    abstract int getMaxWait();
    abstract List<Integer> getDbs();

    @PostConstruct
    public void initRedisTemp() throws Exception { 
       
        log.info("############################################################");
        log.info("###### START 初始化 Redis{} "+this.getClass().getSimpleName()+"连接池 START ######", this.getHost());
        if(StringUtils.isEmpty(getHost())||getHost().equalsIgnoreCase("null")){ 
       
            log.info("无配置,不需要初始化!");
            return;
        }
        defaultDb = this.getDbs().get(0);
        if(this.getDbs().size()==2&&this.getDbs().get(1)!=null){ 
       
            totalDbs = this.getDbs().get(1);
            log.info("init totalDbs : {}",totalDbs);
            for (int i = 0;i < totalDbs; i++) { 
       
                log.info("###### 正在加载Redis-db-" + i+ " ######");
                redisTemplateMap.put(i, getRedisTemplate(i));
            }
        }else{ 
       
            log.info("init defaultDb : {}",defaultDb);
            redisTemplateMap.put(defaultDb, getRedisTemplate(defaultDb));
        }
        log.info("###### END 初始化 Redis 连接池 END ######");

        log.info("###### START 初始化 Redis-queue{} "+this.getClass().getSimpleName()+"连接池 START ######", this.getHost());
        //初始化队列
        LettuceConnectionFactory factory = null;
        if(totalDbs==1){ 
       
            log.info("###### 正在加载Redis-queue-db-" + defaultDb + " ######");
            factory = getDbFactory(defaultDb);
        }else{ 
       
            log.info("###### 正在加载Redis-queue-db-" + (totalDbs-1) + " ######");
            factory = getDbFactory(totalDbs-1);
        }

        stringRedisTemplate.setConnectionFactory(factory);
        stringRedisTemplate.afterPropertiesSet();
        log.info("###### END 初始化 Redis-queue 连接池 END ######");
    }

    private RedisTemplate<String, Object> getRedisTemplate(int dbNo) { 
       
        return getRedisTemplate(getDbFactory(dbNo));
    }

    private LettuceConnectionFactory getDbFactory(int dbNo){ 
       
        LettuceConnectionFactory factory = new LettuceConnectionFactory(getRedisConfig(dbNo), getClientConfig());
        factory.afterPropertiesSet();//必须初始化实例
        return factory;
    }

    private RedisStandaloneConfiguration getRedisConfig(int dbNo) { 
       
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        config.setHostName(this.getHost());
        config.setPort(this.getPort());
        config.setPassword(this.getPassword());
        config.setDatabase(dbNo);
        return config;
    }

    private LettuceClientConfiguration getClientConfig() { 
       
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        poolConfig.setMaxTotal(this.getMaxActive());
        poolConfig.setMaxIdle(this.getMaxIdle());
        poolConfig.setMinIdle(this.getMinIdle());
        poolConfig.setMaxWaitMillis(this.getMaxWait());
        return LettucePoolingClientConfiguration.builder().poolConfig(poolConfig).build();
    }

    private RedisTemplate<String, Object> getRedisTemplate(LettuceConnectionFactory factory) { 
       
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        setSerializer(redisTemplate);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    public RedisTemplate<String, Object> getRedisTemplateByDb(int db){ 
       
        return redisTemplateMap.get(db);
    }

    public StringRedisTemplate getStringRedisTemplate(){ 
       
        return stringRedisTemplate;
    }

    public StringRedisTemplate getDefaultStringRedisTemplate(){ 
       
        if(StringUtils.isEmpty(getHost())||getHost().equalsIgnoreCase("null")){ 
       
            log.info("无配置,不需要初始化!");
            return null;
        }
        LettuceConnectionFactory factory = null;
        if(totalDbs==1){ 
       
            factory = getDbFactory(defaultDb);
        }else{ 
       
            factory = getDbFactory(totalDbs-1);
        }
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(factory);
        stringRedisTemplate.afterPropertiesSet();
        return stringRedisTemplate;
    }

    private void setSerializer(RedisTemplate<String, Object> template) { 
       
        Jackson2JsonRedisSerializer j2jrs = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        om.registerModule(new JavaTimeModule());
        om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
        j2jrs.setObjectMapper(om);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(j2jrs);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(j2jrs);
        template.afterPropertiesSet();
    }
}

RedisConfig 类

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.List;


/** * Redis配置类 * * @author qy */
@Slf4j
@Configuration
public class RedisConfig  extends AbstractRedisConfig{ 
       
    @Value("${spring.redis.host:null}")
    private String host;
    @Value("${spring.redis.port:-1}")
    private int port;
    @Value("${spring.redis.password:null}")
    private String password;
    @Value("${spring.redis.lettuce.pool.max-active:-1}")
    private int maxActive;
    @Value("${spring.redis.lettuce.pool.max-idle:-1}")
    private int maxIdle;
    @Value("${spring.redis.lettuce.pool.min-idle:-1}")
    private int minIdle;
    @Value("${spring.redis.lettuce.pool.max-wait:-1}")
    private int maxWait;

    @Value("${spring.redis.dbs:${spring.redis.database:-1}}")
    private List<Integer> dbs;

    @Bean
    public StringRedisTemplate stringRedisTemplate() { 
       
        return this.getDefaultStringRedisTemplate();
    }

    String getHost(){ 
       
        return this.host;
    }

    int getPort(){ 
       
        return this.port;
    }
    String getPassword(){ 
       
        return this.password;
    }
    int getMaxActive(){ 
       
        return this.maxActive;
    }
    int getMaxIdle(){ 
       
        return this.maxIdle;
    }
    int getMinIdle(){ 
       
        return this.minIdle;
    }
    int getMaxWait(){ 
       
        return this.maxWait;
    }
    List<Integer> getDbs(){ 
       
        return this.dbs;
    }
}

AbstractRedisUtil类

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.CollectionUtils;
import zone.gaohu.utils.config.AbstractRedisConfig;

import java.util.*;
import java.util.concurrent.TimeUnit;

/** * @Description: Redis工具类 */
public abstract class AbstractRedisUtil { 
       
    /** * 补全KEY前缀 */
    public abstract String fillingKey(String key);

    /** * 获取redis初始化信息 */
    public abstract int getDbs();

    /** * 设置redis数据源 * * @return */
    abstract AbstractRedisConfig getRedisConfig();

    /** * 获取redis队列 */
    public StringRedisTemplate getStringRedisTemplate() { 
       
        return this.getRedisConfig().getStringRedisTemplate();
    }

    // =============================common============================

    /** * 指定缓存失效时间 * * @param key 键 * @param time 时间(秒) * @return */
    private boolean expire(String key, long time) { 
       
        if (time > 0) { 
       

            this.getRedisConfig().getRedisTemplateByDb(this.getIndex(key)).expire(key, time, TimeUnit.SECONDS);

        }
        return true;
    }


    /** * 根据key 获取过期时间 * * @param key 键 不能为null * @return 时间(秒) 返回0代表为永久有效 */
    public long getExpire
        标签: jrs1ds过载继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台