package com.ssi.config; import com.google.common.collect.Sets; import com.ssi.model.RedisDataModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisSentinelPool; import redis.clients.util.Pool; import java.util.Objects; /** * Redis配置 */ @Configuration public class RedisConfig { protected Logger logger = LoggerFactory.getLogger(RedisConfig.class); @Autowired private JetCacheRedisConfig jetCacheRedisConfig; @Bean @ConditionalOnProperty(prefix = "redis.node", name = "mode", havingValue = "sentinel") public Pool sentinelPoolFactory() throws Exception { logger.info(String.format("redis配置: %s", jetCacheRedisConfig)); JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(jetCacheRedisConfig.getPool().getMaxIdle()); jedisPoolConfig.setMaxWaitMillis(jetCacheRedisConfig.getPool().getMaxWait().toMillis()); jedisPoolConfig.setJmxEnabled(true); JedisSentinelPool jedisPool = new JedisSentinelPool( jetCacheRedisConfig.getSentinel().getMaster(), Sets.newHashSet(jetCacheRedisConfig.getSentinel().getNodes()), jedisPoolConfig, Integer.parseInt(String.valueOf(jetCacheRedisConfig.getTimeout().toMillis())), jetCacheRedisConfig.getPassword(), jetCacheRedisConfig.getDatabase()); return jedisPool; } @Bean @ConditionalOnProperty(prefix = "redis.node", name = "mode", havingValue = "single") public JedisPool singleNodePoolFactory() throws Exception { logger.info(String.format("redis配置: %s", jetCacheRedisConfig)); JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(jetCacheRedisConfig.getPool().getMaxIdle()); jedisPoolConfig.setMaxWaitMillis(jetCacheRedisConfig.getPool().getMaxWait().toMillis()); jedisPoolConfig.setJmxEnabled(true); // JedisPool jedisPool = new JedisPool(jedisPoolConfig, new URI(jetCacheRedisConfig.getUrl()), Protocol.DEFAULT_TIMEOUT); JedisPool jedisPool = new JedisPool(jedisPoolConfig, jetCacheRedisConfig.getHost(), jetCacheRedisConfig.getPort(), (int)jetCacheRedisConfig.getTimeout().toMillis(),jetCacheRedisConfig.getPassword(),jetCacheRedisConfig.getDatabase(),null); return jedisPool; } @Autowired private RedisConnectionFactory redisConnectionFactory; @Bean public RedisMessageListenerContainer redisMessageListenerContainer() { RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer(); redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory); return redisMessageListenerContainer; } @Bean("singleNodePool") public Pool singleNodePool() { logger.info(String.format("redis配置: %s", jetCacheRedisConfig)); JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(jetCacheRedisConfig.getPool().getMaxIdle()); jedisPoolConfig.setMaxWaitMillis(jetCacheRedisConfig.getPool().getMaxWait().toMillis()); jedisPoolConfig.setJmxEnabled(true); jedisPoolConfig.setMaxTotal(jetCacheRedisConfig.getPool().getMaxActive()); JedisPool jedisPool = new JedisPool(jedisPoolConfig, jetCacheRedisConfig.getSingleNode().getHost(), jetCacheRedisConfig.getSingleNode().getPort(), (int)jetCacheRedisConfig.getTimeout().toMillis(),jetCacheRedisConfig.getSingleNode().getPassword(),jetCacheRedisConfig.getSingleNode().getDatabase(),null); return jedisPool; } @Bean @ConditionalOnProperty(prefix = "redis.node", name = "mode", havingValue = "sentinel") public RedisDataModel redisDataModel(Pool sentinelPoolFactory){ return new RedisDataModel(sentinelPoolFactory); } /*** * * @param singleNodePoolFactory * @return */ @Bean @ConditionalOnProperty(prefix = "redis.node", name = "mode", havingValue = "single") public RedisDataModel redisDataModel(JedisPool singleNodePoolFactory){ return new RedisDataModel(singleNodePoolFactory); } @Bean("singleNodeModel") public RedisDataModel singleNodeModel(Pool singleNodePool){ return new RedisDataModel(singleNodePool); } }