如何隔离 spring boot app redis 和 spring boot session global redis
How to isolate spring boot app redis and spring boot session global redis
据我所知,spring boot 和 spring session 为我们提供了一站式自动配置,但是当我的应用程序使用 session redis 和 app cache redis 时,redis 不是同一个 redis 服务器;
怎么配置呢,非常感谢您的回复!
事实上,默认情况下,spring-session 和 spring-cache 实际上都是由 spring-boot 配置的 RedisConnectionFactory
bean 命名为 connectionFactory
.
有两种方法。
make spring-session
使用不同的 connectionFactory
bean 实例,并保留 spring-cache 以使用默认的 connectionFactory
。下面是一个示例解决方案:
@Configuration
public class RedisHttpSessionConfig {
@Bean
StringRedisSerializer stringRedisSerializer() {
return new StringRedisSerializer();
}
@Bean
RedisConnectionFactory redisHttpSessionConnectionFactory() {
RedisConnectionFactory redisHttpSessionConnectionFactory = null;
// ... add your codes here
return redisHttpSessionConnectionFactory;
}
@Bean
public RedisTemplate<Object, Object> sessionRedisTemplate(
RedisConnectionFactory redisHttpSessionConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setDefaultSerializer(GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(redisHttpSessionConnectionFactory);
return template;
}
}
make spring-cache
使用不同的 connectionFactory
bean 实例,并保留 spring-session 使用默认的 connectionFactory
。下面是一个示例解决方案:
@Configuration
public class RedisCacheConfig {
@Bean
StringRedisSerializer stringRedisSerializer() {
return new StringRedisSerializer();
}
@Bean
RedisConnectionFactory redisCacheConnectionFactory() {
RedisConnectionFactory redisCacheConnectionFactory = null;
// ... add your codes here
return redisCacheConnectionFactory;
}
@Bean
RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisCacheConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisCacheConnectionFactory);
redisTemplate.setKeySerializer(this.stringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean(name = "stringRedisTemplate")
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisCacheConnectionFactory) throws UnknownHostException {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisCacheConnectionFactory);
stringRedisTemplate.setKeySerializer(this.stringRedisSerializer());
stringRedisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return stringRedisTemplate;
}
@Bean
CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
cacheManager.setDefaultExpiration(600l);
cacheManager.setUsePrefix(true);
return cacheManager;
}
}
标记默认的RedisConnectionFactory @Primary
@Bean
@Primary
public RedisConnectionFactory redisConnectionFactory(RedisProperties properties) {
return redisConnectionFactory(redisProperties);
}
并标记会话RedisConnectionFactory @SpringSessionRedisConnectionFactory
@Bean
@SpringSessionRedisConnectionFactory
public RedisConnectionFactory springSessionRedisConnectionFactory() {
return redisConnectionFactory(...);
}
redisConnectionFactory() 配置RedisConnectionFactory。
例如:
private static RedisConnectionFactory redisConnectionFactory(RedisProperties redisProperties, boolean afterPropertiesSet) {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(redisProperties.getHost());
redisStandaloneConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));
redisStandaloneConfiguration.setDatabase(redisProperties.getDatabase());
redisStandaloneConfiguration.setPort(redisProperties.getPort());
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxIdle(redisProperties.getLettuce().getPool().getMaxIdle());
genericObjectPoolConfig.setMinIdle(redisProperties.getLettuce().getPool().getMinIdle());
genericObjectPoolConfig.setMaxTotal(redisProperties.getLettuce().getPool().getMaxActive());
genericObjectPoolConfig.setMaxWaitMillis(redisProperties.getLettuce().getPool().getMaxWait().toMillis());
genericObjectPoolConfig.setTestOnBorrow(true);
genericObjectPoolConfig.setTestOnReturn(true);
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration,
LettucePoolingClientConfiguration.builder().commandTimeout(redisProperties.getTimeout()).poolConfig(genericObjectPoolConfig).build());
if (afterPropertiesSet) {
lettuceConnectionFactory.afterPropertiesSet();
}
return lettuceConnectionFactory;
}
据我所知,spring boot 和 spring session 为我们提供了一站式自动配置,但是当我的应用程序使用 session redis 和 app cache redis 时,redis 不是同一个 redis 服务器; 怎么配置呢,非常感谢您的回复!
事实上,默认情况下,spring-session 和 spring-cache 实际上都是由 spring-boot 配置的 RedisConnectionFactory
bean 命名为 connectionFactory
.
有两种方法。
make
spring-session
使用不同的connectionFactory
bean 实例,并保留 spring-cache 以使用默认的connectionFactory
。下面是一个示例解决方案:@Configuration public class RedisHttpSessionConfig { @Bean StringRedisSerializer stringRedisSerializer() { return new StringRedisSerializer(); } @Bean RedisConnectionFactory redisHttpSessionConnectionFactory() { RedisConnectionFactory redisHttpSessionConnectionFactory = null; // ... add your codes here return redisHttpSessionConnectionFactory; } @Bean public RedisTemplate<Object, Object> sessionRedisTemplate( RedisConnectionFactory redisHttpSessionConnectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>(); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setDefaultSerializer(GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisHttpSessionConnectionFactory); return template; } }
make
spring-cache
使用不同的connectionFactory
bean 实例,并保留 spring-session 使用默认的connectionFactory
。下面是一个示例解决方案:@Configuration public class RedisCacheConfig { @Bean StringRedisSerializer stringRedisSerializer() { return new StringRedisSerializer(); } @Bean RedisConnectionFactory redisCacheConnectionFactory() { RedisConnectionFactory redisCacheConnectionFactory = null; // ... add your codes here return redisCacheConnectionFactory; } @Bean RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisCacheConnectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(redisCacheConnectionFactory); redisTemplate.setKeySerializer(this.stringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } @Bean(name = "stringRedisTemplate") public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisCacheConnectionFactory) throws UnknownHostException { StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(); stringRedisTemplate.setConnectionFactory(redisCacheConnectionFactory); stringRedisTemplate.setKeySerializer(this.stringRedisSerializer()); stringRedisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return stringRedisTemplate; } @Bean CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); cacheManager.setDefaultExpiration(600l); cacheManager.setUsePrefix(true); return cacheManager; } }
标记默认的RedisConnectionFactory @Primary
@Bean
@Primary
public RedisConnectionFactory redisConnectionFactory(RedisProperties properties) {
return redisConnectionFactory(redisProperties);
}
并标记会话RedisConnectionFactory @SpringSessionRedisConnectionFactory
@Bean
@SpringSessionRedisConnectionFactory
public RedisConnectionFactory springSessionRedisConnectionFactory() {
return redisConnectionFactory(...);
}
redisConnectionFactory() 配置RedisConnectionFactory。 例如:
private static RedisConnectionFactory redisConnectionFactory(RedisProperties redisProperties, boolean afterPropertiesSet) {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(redisProperties.getHost());
redisStandaloneConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));
redisStandaloneConfiguration.setDatabase(redisProperties.getDatabase());
redisStandaloneConfiguration.setPort(redisProperties.getPort());
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxIdle(redisProperties.getLettuce().getPool().getMaxIdle());
genericObjectPoolConfig.setMinIdle(redisProperties.getLettuce().getPool().getMinIdle());
genericObjectPoolConfig.setMaxTotal(redisProperties.getLettuce().getPool().getMaxActive());
genericObjectPoolConfig.setMaxWaitMillis(redisProperties.getLettuce().getPool().getMaxWait().toMillis());
genericObjectPoolConfig.setTestOnBorrow(true);
genericObjectPoolConfig.setTestOnReturn(true);
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration,
LettucePoolingClientConfiguration.builder().commandTimeout(redisProperties.getTimeout()).poolConfig(genericObjectPoolConfig).build());
if (afterPropertiesSet) {
lettuceConnectionFactory.afterPropertiesSet();
}
return lettuceConnectionFactory;
}