在Heroku上使用Spring Boot应用连接Redis

关于这篇文章

以下是关于如何在Heroku上构建Spring Boot应用程序并使用Redis的方法。虽然在Heroku Redis- Connecting In Java的官方文档中已经提到了,但是我觉得信息有些不足,因此我稍作改进并包含了RedisTemplate的Bean定义。

假设

    HerokuにPush済みのSpring Bootアプリーケーション(2系)があること

进行Redis的设置

这是Heroku官方的指示。
我们要添加Redis的附加组件。

$ heroku addons:create heroku-redis:hobby-dev -a <<APP_NAME>>

追加后,您将在Heroku附加组件中看到Heroku-Redis出现。
此外,在Heroku上,连接信息已经设置在名为REDIS_URL的环境变量中。

$ heroku config | grep redis
REDIS_URL:          redis://h:<<PASSWORD>>@<<HOST>>:<<PORT>>

由于这个值可能会发生变化,所以我们需要将其作为环境变量进行处理,而不是直接在源代码中写入值,例如System.getenv(“REDIS_URL”)。

使用Spring Data Redis

将SpringDataRedis添加到依赖关系中。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
</dependency>

Bean的定义

为了使用Redis,我们将创建以下的Bean定义。

JedisPoolConfig: コネクションプールの設定

JedisConnectionFactory:Jedisベースのコネクションを作成するファクトリ

RedisTemplate: Redisへのアクセスを抽象化してくるクラス

@Profile("heroku")
@Configuration
public class RedistConfigHeroku {

    @Bean
    JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(10);
        poolConfig.setMaxIdle(5);
        poolConfig.setMinIdle(1);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(true);
        poolConfig.setTestWhileIdle(true);
        return poolConfig;
    }

    @Bean
    public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) throws URISyntaxException {
        String envRedisUrl = System.getenv("REDIS_URL");
        URI redisUri = new URI(envRedisUrl);

        RedisStandaloneConfiguration hostConfig = new RedisStandaloneConfiguration();
        hostConfig.setPort(redisUri.getPort());
        hostConfig.setHostName(redisUri.getHost());
        hostConfig.setPassword(redisUri.getUserInfo().split(":", 2)[1]);

        JedisClientConfiguration.JedisClientConfigurationBuilder builder = JedisClientConfiguration.builder();
        JedisClientConfiguration clientConfig = builder
                .usePooling()
                .poolConfig(jedisPoolConfig)
                .build();

        JedisConnectionFactory factory = new JedisConnectionFactory(hostConfig, clientConfig);
        return factory;
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate(JedisConnectionFactory connectionFactory) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setHashKeySerializer(redisTemplate.getKeySerializer());
        redisTemplate.setHashValueSerializer(redisTemplate.getValueSerializer());
        return redisTemplate;
    }

以下是利用側的示例。

@Service
public class SomeService {
  private final RedisTemplate<String, String> redisTemplate;

  // コンストラクタインジェクション
  public SomeService(RedisTemplate redisTemplate) {
    this.redisTemplate = redisTemplate;
  }

  public void doSomething() {   
    // write
    redisTemplate.opsForValue().set(key, value);

    // read
    String value = redisTemplate.opsForValue().get(key);
  }
}

个人资料的指定

在这个例子中,我们定义了一个名为heroku的配置文件,用于Heroku。

因为要阅读这个Bean定义,所以我会在Procfile中添加-Dspring.profiles.active=heroku来帮助你。(如果已经存在配置文件,也会一并包含)

web: java -jar -Dspring.profiles.active=heroku target/app.jar --server.port=${PORT}
广告
将在 10 秒后关闭
bannerAds