Spring Redis travaille avec spring-data-redis
avec toutes les configurations par défaut comme localhost
default port
et ainsi de suite.
Maintenant, j'essaie de faire la même configuration en le configurant dans le fichier application.properties
. Mais je ne peux pas comprendre comment créer des beans si mes valeurs de propriété sont lues.
Fichier de configuration Redis
@EnableRedisHttpSession
@Configuration
public class SpringSessionRedisConfiguration {
@Bean
JedisConnectionFactory connectionFactory() {
return new JedisConnectionFactory();
}
@Autowired
@Bean
RedisCacheManager redisCacheManager(final StringRedisTemplate stringRedisTemplate) {
return new RedisCacheManager(stringRedisTemplate);
}
@Autowired
@Bean
StringRedisTemplate template(final RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}
Paramètres standard dans application.properties
spring.redis.sentinel.master = maître
spring.redis.sentinel.nodes = 192.168.188.231: 26379
spring.redis.password = 12345
Ce que j'ai essayé,
@PropertySource
puis injecter @Value
et obtenir les valeurs. Mais je ne veux pas faire cela car ces propriétés ne sont pas définies par moi mais proviennent du printemps.RedisProperties
devrait m'aider, mais je ne sais toujours pas comment dire à Spring de lire à partir du fichier de propriétés.Vous pouvez utiliser @PropertySource
pour lire les options à partir de application.properties ou d'un autre fichier de propriétés souhaité. Veuillez regarder Exemple d'utilisation de PropertySource et marche exemple d'utilisation de spring-redis-cache . Ou regardez ce petit échantillon:
@Configuration
@PropertySource("application.properties")
public class SpringSessionRedisConfiguration {
@Value("${redis.hostname}")
private String redisHostName;
@Value("${redis.port}")
private int redisPort;
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Bean
JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(redisHostName);
factory.setPort(redisPort);
factory.setUsePool(true);
return factory;
}
@Bean
RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
return redisTemplate;
}
@Bean
RedisCacheManager cacheManager() {
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
return redisCacheManager;
}
}
Actuellement (décembre 2015) les spring.redis.sentinel options de application.properties
ne prennent en charge que RedisSentinelConfiguration
:
Veuillez noter qu'actuellement, seulement Jedis et laitue Laitue soutient Redis Sentinel.
Vous pouvez en savoir plus à ce sujet dans documentation officielle .
En cherchant plus profondément, j'ai trouvé ceci, est-ce que c'est ce que vous recherchez?
# REDIS (RedisProperties)
spring.redis.database=0 # Database index used by the connection factory.
spring.redis.Host=localhost # Redis server Host.
spring.redis.password= # Login password of the redis server.
spring.redis.pool.max-active=8 # Max number of connections that can be allocated by the pool at a given time. Use a negative value for no limit.
spring.redis.pool.max-idle=8 # Max number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections.
spring.redis.pool.max-wait=-1 # Maximum amount of time (in milliseconds) a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely.
spring.redis.pool.min-idle=0 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive.
spring.redis.port=6379 # Redis server port.
spring.redis.sentinel.master= # Name of Redis server.
spring.redis.sentinel.nodes= # Comma-separated list of Host:port pairs.
spring.redis.timeout=0 # Connection timeout in milliseconds.
Référence: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html Searchterm Redis
De ce que je peux voir les valeurs existent déjà et sont définies comme
spring.redis.Host=localhost # Redis server Host.
spring.redis.port=6379 # Redis server port.
si vous voulez créer vos propres propriétés, vous pouvez consulter mon post précédent dans ce fil.
Cela fonctionne pour moi:
@Configuration
@EnableRedisRepositories
public class RedisConfig {
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
RedisProperties properties = redisProperties();
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName(properties.getHost());
configuration.setPort(properties.getPort());
return new JedisConnectionFactory(configuration);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
final RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
return template;
}
@Bean
@Primary
public RedisProperties redisProperties() {
return new RedisProperties();
}
}
et fichier de propriétés:
spring.redis.Host=localhost
spring.redis.port=6379
J'ai trouvé cela dans la doc de démarrage du printemps section 24 paragraphe 7
@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {
private String username;
private InetAddress remoteAddress;
// ... getters and setters
}
Les propriétés peuvent ensuite être modifiées via connection.property
Voici une solution élégante pour résoudre votre problème:
@Configuration
@PropertySource(name="application", value="classpath:application.properties")
public class SpringSessionRedisConfiguration {
@Resource
ConfigurableEnvironment environment;
@Bean
public PropertiesPropertySource propertySource() {
return (PropertiesPropertySource) environment.getPropertySources().get("application");
}
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory(sentinelConfiguration(), poolConfiguration());
}
@Bean
public RedisSentinelConfiguration sentinelConfiguration() {
return new RedisSentinelConfiguration(propertySource());
}
@Bean
public JedisPoolConfig poolConfiguration() {
JedisPoolConfiguration config = new JedisPoolConfiguration();
// add your customized configuration if needed
return config;
}
@Bean
RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
return redisTemplate;
}
@Bean
RedisCacheManager cacheManager() {
return new RedisCacheManager(redisTemplate());
}
}
alors, pour résumer:
Testé dans mon espace de travail, Cordialement
Vous pouvez utiliser ResourcePropertySource pour générer un objet PropertySource.
PropertySource propertySource = new ResourcePropertySource("path/to/your/application.properties");
Puis transmettez-le au constructeur de RedisSentinelConfiguration.
Utilisez @DirtiesContext(classMode = classmode.AFTER_CLASS)
à chaque classe de test. Cela fonctionnera sûrement pour vous.
Je pense que c'est ce que vous recherchez http://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html