web-dev-qa-db-ja.com

Spring Redis-application.propertiesファイルから構成を読み取ります

localhost default portなどのすべてのデフォルト構成でspring-data-redisを使用してSpring Redisを動作させています。

application.propertiesファイルで設定することにより、同じ設定をしようとしています。しかし、プロパティ値が読み取られることを正確にBeanを作成する方法を理解することはできません。

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

Application.propertiesの標準パラメーター

spring.redis.sentinel.master = themaster

spring.redis.sentinel.nodes = 192.168.188.231:26379

spring.redis.password = 12345

私が試したもの、

  1. @PropertySourceを使用してから@Valueを挿入し、値を取得できます。しかし、これらのプロパティは私が定義したものではなく、Springからのものであるため、そうしたくありません。
  2. このドキュメントでは、 Spring Redis Documentation では、プロパティを使用して設定できるとのみ記載されていますが、具体的な例を示していません。
  3. また、Spring Data Redis APIクラスを調べたところ、RedisPropertiesが役立つはずですが、Springにプロパティファイルから読み取るように指示する方法を正確に把握することはできません。
19
Shrikant Havale

@PropertySourceを使用して、application.propertiesまたは必要な他のプロパティファイルからオプションを読み取ることができます。 PropertySourceの使用例 および作業中の spring-redis-cacheの使用例 をご覧ください。または、この小さなサンプルを見てください:

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

現在(2015年12月spring.redis.sentinelapplication.propertiesのオプションでは、RedisSentinelConfigurationのサポートが制限されています:

現在、 Jedis およびレタス Lettuce のみがRedis Sentinelをサポートしていることに注意してください。

詳細については 公式ドキュメント をご覧ください。

28
misterion

もっと深く見てみると、私はこれを見つけました、あなたが探しているものでしょうか?

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

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

私が見ることができるものから、値はすでに存在し、次のように定義されています

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

独自のプロパティを作成する場合は、このスレッドの以前の投稿をご覧ください。

8
Wheelchair Geek

これは私のために働く:

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

}

およびプロパティファイル:

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

これは、スプリングブートドキュメントセクション24段落7で見つけました

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

    private String username;

    private InetAddress remoteAddress;

    // ... getters and setters

} 

その後、connection.propertyを介してプロパティを変更できます

参照リンク: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration -properties

1
Wheelchair Geek

ここにあなたの問題を解決するエレガントなソリューションがあります:

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

}

したがって、再開するには:

  • @PropertySourceに特定の名前を追加します
  • 環境の代わりにConfigurableEnvironmentを注入します
  • @PropertySourceで言及した名前を使用して、ConfigurableEnvironmentでPropertiesPropertySourceを取得します
  • このPropertySourceオブジェクトを使用して、RedisSentinelConfigurationオブジェクトを構築します
  • プロパティファイルに「spring.redis.sentinel.master」および「spring.redis.sentinel.nodes」プロパティを追加することを忘れないでください

私のワークスペースでテスト、よろしく

1
Kelevra

ResourcePropertySourceを使用して、PropertySourceオブジェクトを生成できます。

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

次に、RedisSentinelConfigurationのコンストラクターに渡します。

0
Kylo Zhang

各テストクラスで@DirtiesContext(classMode = classmode.AFTER_CLASS)を使用します。これは確実に機能します。

0
tarun goel
0
Pulkit