在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}