集群配置
@Configuration
@Slf4j
@ConditionalOnProperty(name = "spring.cluster.nodes")
public class RedisClusterConfig {
@Value("${}")
private String nodes;
@Value("${}")
private Integer maxRedirects;
@Bean
public JedisPoolConfig getJedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
return jedisPoolConfig;
}
/**
* Redis集群的配置
*
* @return RedisClusterConfiguration
*/
@Bean
public RedisClusterConfiguration redisClusterConfiguration() {
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
String[] serverArray = nodes.split(",");
Set<RedisNode> nodes = new HashSet<RedisNode>();
for (String ipPort : serverArray) {
String[] ipAndPort = ipPort.split(":");
nodes.add(new RedisNode(ipAndPort[0].trim(), Integer.valueOf(ipAndPort[1])));
}
redisClusterConfiguration.setClusterNodes(nodes);
redisClusterConfiguration.setMaxRedirects(maxRedirects);
return redisClusterConfiguration;
}
/**
* redis连接工厂类
*
* @return JedisConnectionFactory
*/
@Bean
public JedisConnectionFactory aiJedisConnectionFactory() {
// 集群模式
JedisConnectionFactory factory = new JedisConnectionFactory(redisClusterConfiguration(), getJedisPoolConfig());
return factory;
}
/**
* 实例化 RedisTemplate 对象
*
* @return RedisTemplate<String , Object>
*/
@Bean(name = "aiRedisTemplate")
public RedisTemplate<String, byte[]> aiRedisTemplate() {
RedisTemplate<String, byte[]> redisTemplate = new RedisTemplate<>();
// Template初始化
initDomainRedisTemplate(redisTemplate);
log.info("redis 初始化成功, nodes:{}", nodes);
return redisTemplate;
}
/**
* 设置数据存入 redis 的序列化方式 使用默认的序列化会导致key乱码
*/
private void initDomainRedisTemplate(RedisTemplate<String, byte[]> redisTemplate) {
// 开启redis数据库事务的支持
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.setConnectionFactory( aiJedisConnectionFactory());
// 如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can‘t cast to
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(new ByteRedisSerializer());
redisTemplate.afterPropertiesSet();
}
}
多个单体配置
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
/**
* 本地数据源 redis template
* @param database
* @param timeout
* @param maxTotal
* @param maxWait
* @param maxIdle
* @param minIdle
* @param hostName
* @param port
* @param password
* @return
*/
@Bean
public RedisTemplate biRedisTemplate(
@Value("${spring.redis2.database}") int database,
@Value("${spring.redis2.timeout}") long timeout,
@Value("${spring.redis2.lettuce.pool.max-total}") int maxTotal,
@Value("${spring.redis2.lettuce.pool.max-wait}") int maxWait,
@Value("${spring.redis2.lettuce.pool.max-idle}") int maxIdle,
@Value("${spring.redis2.lettuce.pool.min-idle}") int minIdle,
@Value("${spring.redis2.host}") String hostName,
@Value("${spring.redis2.port}") int port,
@Value("${spring.redis2.password}") String password) {
/** ========= 基本配置 ========= */
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName(hostName);
configuration.setPort(port);
configuration.setDatabase(database);
if (!ObjectUtils.isEmpty(password)) {
RedisPassword redisPassword = RedisPassword.of(password);
configuration.setPassword(redisPassword);
}
/** ========= 连接池通用配置 ========= */
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxTotal(maxTotal);
genericObjectPoolConfig.setMinIdle(minIdle);
genericObjectPoolConfig.setMaxIdle(maxIdle);
genericObjectPoolConfig.setMaxWaitMillis(maxWait);
/** ========= lettuce pool ========= */
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
builder.poolConfig(genericObjectPoolConfig);
builder.commandTimeout(Duration.ofSeconds(timeout));
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build());
connectionFactory.afterPropertiesSet();
/** ========= 创建 template ========= */
return createRedisTemplate(connectionFactory);
}
@Bean
public RedisConnectionFactory redisConnectionFactory(
@Value("${spring.redis.database}") int database,
@Value("${spring.redis.timeout}") long timeout,
@Value("${spring.redis.lettuce.pool.max-total}") int maxTotal,
@Value("${spring.redis.lettuce.pool.max-wait}") int maxWait,
@Value("${spring.redis.lettuce.pool.max-idle}") int maxIdle,
@Value("${spring.redis.lettuce.pool.min-idle}") int minIdle,
@Value("${spring.redis.host}") String hostName,
@Value("${spring.redis.port}") int port,
@Value("${spring.redis.password}") String password) {
/** ========= 基本配置 ========= */
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName(hostName);
configuration.setPort(port);
configuration.setDatabase(database);
if (!ObjectUtils.isEmpty(password)) {
RedisPassword redisPassword = RedisPassword.of(password);
configuration.setPassword(redisPassword);
}
/** ========= 连接池通用配置 ========= */
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxTotal(maxTotal);
genericObjectPoolConfig.setMinIdle(minIdle);
genericObjectPoolConfig.setMaxIdle(maxIdle);
genericObjectPoolConfig.setMaxWaitMillis(maxWait);
/** ========= lettuce pool ========= */
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
builder.poolConfig(genericObjectPoolConfig);
builder.commandTimeout(Duration.ofSeconds(timeout));
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build());
connectionFactory.afterPropertiesSet();
/** ========= 创建 template ========= */
return connectionFactory;
}
@Bean
public RedisTemplate redisTemplate(@Qualifier(value ="redisConnectionFactory" ) RedisConnectionFactory redisConnectionFactory) {
return createRedisTemplate(redisConnectionFactory);
}
@Bean
public RedisTemplate redisByteArrayTemplate(RedisConnectionFactory redisConnectionFactory) {
return createRedisByteArrayTemplate(redisConnectionFactory);
}
private RedisTemplate createRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
private RedisTemplate createRedisByteArrayTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, byte[]> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new ByteRedisSerializer());
return redisTemplate;
}
}
注意
redisConnectionFactory这个bean会在源码中判定,是redistemplate默认使用的,所以在创建的时候不要覆盖
原文:https://www.cnblogs.com/mayWorldPeace/p/14597496.html