wake-up-neo.net

Spring Redis - Liest die Konfiguration aus der Datei application.properties

Ich habe Spring Redis, der spring-data-redis mit allen Standardkonfigurationen wie localhost default port usw. verwendet.

Jetzt versuche ich, dieselbe Konfiguration vorzunehmen, indem ich sie in der application.properties-Datei konfiguriere. Ich kann jedoch nicht herausfinden, wie ich Beans erstellen kann, die genau meine Eigenschaftswerte lesen.

Redis Konfigurationsdatei

@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);
}
}

Standardparameter in application.properties

spring.redis.sentinel.master = themaster

spring.redis.sentinel.nodes = 192.168.188.231: 26379

spring.redis.password = 12345

Was ich versucht habe

  1. Ich kann möglicherweise @PropertySource verwenden und dann @Value injizieren und die Werte abrufen. Aber ich möchte das nicht tun, da diese Eigenschaften nicht von mir definiert werden, sondern vom Frühling stammen.
  2. In dieser Dokumentation Spring Redis Documentation heißt es nur, dass sie mit Eigenschaften konfiguriert werden kann, aber kein konkretes Beispiel zeigt.
  3. Ich ging auch durch Spring Data Redis API-Klassen und fand heraus, dass RedisProperties mir helfen sollte, aber immer noch nicht herausfinden kann, wie Spring genau aus der Eigenschaftendatei gelesen werden soll.
16
Shrikant Havale

Sie können @PropertySource verwenden, um Optionen aus application.properties oder einer anderen gewünschten Eigenschaftsdatei zu lesen. Schauen Sie sich das PropertySource-Verwendungsbeispiel an und das Arbeits- Verwendungsbeispiel spring-redis-cache . Oder schauen Sie sich dieses kleine Beispiel an:

@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;
    }
}

In der jetzigen Zeit (Dezember 2015) haben die Optionen spring.redis.sentinel in application.properties die Unterstützung von RedisSentinelConfiguration eingeschränkt:

Bitte beachten Sie, dass zur Zeit nur Jedis und Salat Salat Redis Sentinel unterstützt werden.

Weitere Informationen hierzu finden Sie in Offizielle Dokumentation

26
misterion

Als ich tiefer schaute, fand ich das, könnte es das sein, wonach Sie suchen? 

# 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. 

Refernce: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html Searchterm Redis 

Von dem, was ich sehen kann, existieren die Werte bereits und sind als definiert 

spring.redis.Host=localhost # Redis server Host.
spring.redis.port=6379 # Redis server port.

wenn Sie Ihre eigenen Eigenschaften erstellen möchten, können Sie sich meinen vorherigen Beitrag in diesem Thread ansehen. 

6
Wheelchair Geek

Das funktioniert für mich:

@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();
    }

}

und Eigenschaftendatei:

spring.redis.Host=localhost
spring.redis.port=6379
1
user2846650

Ich habe dies im Abschnitt 24 des Federstiefel-Dokuments 24 gefunden

@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {

    private String username;

    private InetAddress remoteAddress;

    // ... getters and setters

} 

Eigenschaften können dann über connection.property geändert werden 

Referenzlink: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-immobilien

1
Wheelchair Geek

Hier ist eine elegante Lösung, um Ihr Problem zu lösen:

@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());
    }

}

also, um fortzufahren:

  • fügen Sie einen bestimmten Namen für die @PropertySource hinzu
  • injizieren Sie eine konfigurierbare Umgebung anstelle von Umgebung
  • rufen Sie die PropertiesPropertySource in Ihrer ConfigurableEnvironment mit dem Namen ab, den Sie in Ihrer @PropertySource angegeben haben
  • Verwenden Sie dieses PropertySource-Objekt, um Ihr RedisSentinelConfiguration-Objekt zu erstellen
  • Vergessen Sie nicht, die Eigenschaften 'spring.redis.sentinel.master' und 'spring.redis.sentinel.nodes' in Ihrer Eigenschaftendatei hinzuzufügen

In meinem Arbeitsbereich getestet.... Grüße

1
Kelevra

Mit der ResourcePropertySource können Sie ein PropertySource-Objekt generieren.

PropertySource propertySource = new ResourcePropertySource("path/to/your/application.properties");

Dann übergeben Sie es an den Konstruktor der RedisSentinelConfiguration.

0
Kylo Zhang

Verwenden Sie @DirtiesContext(classMode = classmode.AFTER_CLASS) in jeder Testklasse. Das wird sicherlich für Sie funktionieren.

0
tarun goel
0
Pulkit