redis多数据源

因为代码简单,所有没有太多注释,请谅解

一.基础配置类

主要用于加载redis配置

@Configuration
@ConfigurationProperties(prefix = "spring.multiple-redis")
public class RedisConfig {

    private String primary;

    private Map source;

    private Map pool;

    public String getPrimary() {
        return primary;
    }

    public void setPrimary(String primary) {
        this.primary = primary;
    }

    public Map getSource() {
        return source;
    }

    public void setSource(Map source) {
        this.source = source;
    }

    public Map getPool() {
        return pool;
    }

    public void setPool(Map pool) {
        this.pool = pool;
    }
}
/**
 * 详细信息
 */
class Detail {

    private String host;
    private int port;
    private String password;
    private int database;
    private int timeout;
    private Map pool;

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getDatabase() {
        return database;
    }

    public void setDatabase(int database) {
        this.database = database;
    }

    public int getTimeout() {
        return timeout;
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    public Map getPool() {
        return pool;
    }

    public void setPool(Map pool) {
        this.pool = pool;
    }
}

redis多数据源相关配置

spring:
  multiple-redis:
    primary: redis
    source:
      redis:
        host: xxxxx
        port: 6379
        password: xxxxx
        database: 5
      redis0:
        host: xxxxx
        port: 6379
        password: xxxxx
        database: 0
      redis15:
        host: xxxxx
        port: 6379
        password: xxxxx
        database: 15
    pool:
      #连接池最大连接数(使用负值表示没有限制)
      max-active: 200
      # 连接池中的最大空闲连接
      max-idle: 20
      #连接池中的最小空闲连接
      min-idle: 5
      # 当连接池耗尽时, 抛出异常之前,连接分配被阻塞的时间,也就是连接池满后最长等待时间,负值表示无限期等待
      max-wait: 2000

二.redis基础工厂

BaseRedisConfig
@EnableCaching
@Configuration
public class BaseRedisConfig {

    @Value("${spring.multiple-redis.pool.max-active}")
    private int redisPoolMaxActive;

    @Value("${spring.multiple-redis.pool.max-wait}")
    private int redisPoolMaxWait;

    @Value("${spring.multiple-redis.pool.max-idle}")
    private int redisPoolMaxIdle;

    @Value("${spring.multiple-redis.pool.min-idle}")
    private int redisPoolMinIdle;

    /**
     * 创建redis连接工厂
     */
    public JedisConnectionFactory createJedisConnectionFactory(Detail detail) {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setDatabase(detail.getDatabase());
        jedisConnectionFactory.setHostName(detail.getHost());
        jedisConnectionFactory.setPort(detail.getPort());
        jedisConnectionFactory.setPassword(detail.getPassword());
        jedisConnectionFactory.setTimeout(detail.getTimeout());
        if(CollectionUtils.isEmpty(detail.getPool())){
            jedisConnectionFactory.setPoolConfig(setPoolConfig(redisPoolMaxIdle, redisPoolMinIdle, redisPoolMaxActive, redisPoolMaxWait, true));
        }else{
            Map pool = detail.getPool();
            try{
                jedisConnectionFactory.setPoolConfig(setPoolConfig(pool.get("max-idle"),pool.get("min-idle"),pool.get("max-active"),pool.get("max-wait"),true));
            } catch (Exception e){
                throw new RuntimeException("pool detail error!");
            }
        }
        return jedisConnectionFactory;
    }

    /**
     * 设置连接池属性
     */
    public JedisPoolConfig setPoolConfig(int maxIdle, int minIdle, int maxActive, int maxWait, boolean testOnBorrow) {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxIdle(maxIdle);
        poolConfig.setMinIdle(minIdle);
        poolConfig.setMaxTotal(maxActive);
        poolConfig.setMaxWaitMillis(maxWait);
        poolConfig.setTestOnBorrow(testOnBorrow);
        return poolConfig;
    }

    /**
     * 设置RedisTemplate的序列化方式
     */
    public void setSerializer(RedisTemplate redisTemplate) {
        Jackson2JsonRedisSerializer jacksonJsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonJsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(jacksonJsonRedisSerializer);
        // hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(jacksonJsonRedisSerializer);
    }
}

redis默认数据源类

DefaultRedisConfig
@EnableCaching
@Configuration
public class DefaultRedisConfig extends BaseRedisConfig {

    @Autowired
    private RedisConfig redisConfig;

    /**
     * 配置redis连接工厂
     */
    @Bean
    @Primary
    public RedisConnectionFactory defaultRedisConnectionFactory() {
        String defaultRedis = redisConfig.getPrimary();
        if(StringUtils.isEmpty(defaultRedis)){
            throw new RuntimeException("redis not have Primary");
        }
        Detail detail = redisConfig.getSource().get(defaultRedis);
        return createJedisConnectionFactory(detail);
    }

    @Bean(name = "redisTemplate")
    public RedisTemplate redisTemplate() {
        RedisTemplate template = new RedisTemplate();
        template.setConnectionFactory(defaultRedisConnectionFactory());
        setSerializer(template);
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public RedisCache redisCache(RedisTemplate redisTemplate){
        return new RedisCacheImpl(redisTemplate);
    }
}

redis多数据源类 

MultipleRedisConfig
@Configuration
@EnableCaching
public class MultipleRedisConfig extends BaseRedisConfig {

    @Autowired
    private RedisConfig redisConfig;

    public JedisConnectionFactory redisConnectionFactory(Detail detailConfig) {
        return createJedisConnectionFactory(detailConfig);
    }

    @Bean
    public Map multipleRedis() {
        Map map = redisConfig.getSource();
        Map templates = new HashMap<>(map.size());
        for (String key : map.keySet()) {
            Detail detail = map.get(key);
            JedisConnectionFactory factory = redisConnectionFactory(detail);
            RedisTemplate redisTemplate = redisTemplate(factory);
            RedisCache redisCache = muRedisCache(redisTemplate);
            templates.put(key,redisCache);
        }
        return templates;
    }

    public RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
        RedisTemplate template = new RedisTemplate();
        template.setConnectionFactory(jedisConnectionFactory);
        setSerializer(template);
        template.afterPropertiesSet();
        return template;
    }

    public RedisCache muRedisCache(RedisTemplate redisTemplate){
        return new RedisCacheImpl(redisTemplate);
    }

}

三:使用方式

    //默认数据源
    @Autowired
    private RedisCache redisCache;
    
    //redis0数据源
    @Value("#{multipleRedis.redisCache0}")
    private RedisCache redisCache0;

 

 

 

 

你可能感兴趣的:(redis,架构笔记)