В моем проекте Spring контроллеров REST я хочу хранить информацию о сеансе в Redis, а мою пользовательскую информацию (все, что мне нужно) также в Redis, но в отдельной базе данных.
В моем application.properties я определил следующее:
spring.session.store-type=redis
spring.session.redis.namespace=rdrestcore
spring.redis.host=192.168.201.46
spring.redis.port=6379
spring.redis.database=5
com.xyz.redis.host=192.168.201.46
com.xyz.redis.db=0
com.xyz.redis.port=6379
com.xyz.redis.pool.min-idle=5
У меня также есть класс со следующим кодом (я где-то читал, что мне нужен этот класс, чтобы позволить Spring управлять сеансами в Redis ... как видите, у него нет кода):
@Configuration
@EnableRedisHttpSession
public class SessionConfig extends AbstractHttpSessionApplicationInitializer
{}
Наконец-то у меня есть такая фабрика соединений Redis:
@Configuration
@EnableRedisRepositories
public class RdRedisConnectionFactory {
@Autowired
private Environment env;
@Value("${com.xyz.redis.host}")
private String redisHost;
@Value("${com.xyz.redis.db}")
private Integer redisDb;
@Value("${com.xyz.redis.port}")
private Integer redisPort;
@Value("${com.xyz.redis.pool.min-idle}")
private Integer redisPoolMinIdle;
@Bean
JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
if (redisPoolMinIdle!=null) poolConfig.setMinIdle(redisPoolMinIdle);
return poolConfig;
}
@Bean
JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
if (redisHost!=null) jedisConFactory.setHostName(redisHost);
if (redisPort!=null) jedisConFactory.setPort(redisPort);
if (redisDb!=null) jedisConFactory.setDatabase(redisDb);
jedisConFactory.setPoolConfig(jedisPoolConfig());
return jedisConFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
final RedisTemplate< String, Object > template = new RedisTemplate();
template.setConnectionFactory( jedisConnectionFactory() );
template.setKeySerializer( new StringRedisSerializer() );
template.setHashValueSerializer( new StringRedisSerializer() );
template.setValueSerializer( new StringRedisSerializer() );
return template;
}
}
И когда мне нужен Redis для чтения или записи, я просто автоматически подключаю redisTemplate, где мне это нужно, и он работает.
Теперь ... проблема: информация о сеансе Spring сохраняется в той же базе данных, что и моя настраиваемая информация, хотя я указал базу данных 5 для информации о сеансе и базу данных 0 для моей настраиваемой информации. Все идет в базу данных 0.
Кто-нибудь знает, что я делаю не так?
Спасибо




Использование другого идентификатора bean-компонента для возможного дублирования bean-компонента - хорошая идея.
@Bean
JedisConnectionFactory jedisConnectionFactory() {...connection}
Вышеупомянутая функция определила bean-компонент и дала ему идентификатор по умолчанию: jedisConnectionFactory, это может заменить тот, который, по вашему мнению, Spring использует для создания StringRedisTemplate (настроенный spring.redis.xxx), который также ищет bean-компонент класса JedisConnectionFactory с тем же bean-компонентом. я бы. В результате они оба используют определение из {...connection}.
Кстати: Это не имеет значения, но я заметил, что вы определяете свой собственный bean-компонент с помощью аннотации @Bean, но вы не использовали его более правильным образом:
@Bean(name = "myJedisPool")
JedisPoolConfig jedisPoolConfig() {
}
JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
// use spring managed bean.
jedisConFactory.setPoolConfig(jedisPoolConfig);
}
@Bean(name = "myRedisTemplate")
public RedisTemplate<String, Object> redisTemplate(@Qualifier("myJedisPool") JedisPoolConfig jedisPoolConfig) {
// use spring managed bean.
template.setConnectionFactory( jedisConnectionFactory(jedisPoolConfig) );
}
Или вы сочли бесполезным иметь такое количество бобов, поэтому вы сокращаете количество бобов следующим образом:
// not a bean
JedisPoolConfig getJedisPoolConfig() {
}
// not a bean
JedisConnectionFactory getJedisConnectionFactory() {
jedisConFactory.setPoolConfig(getJedisPoolConfig());
}
// only this is bean, because consumers are expecting this.
@Bean(name = "myRedisTemplate")
public RedisTemplate<String, Object> redisTemplate() {
template.setConnectionFactory( getJedisConnectionFactory() );
}