Spring BootアプリケーションにRedissonを統合することで、分布型データ構造やサービスを容易に利用できます。以下の手順は、依存関係の追加、設定、主要なデータ型の操作、分布型ロックの使用を網羅しています。
1. 依存関係の追加
Spring Bootプロジェクトの`pom.xml`ファイルにRedissonの依存を追加します。最新バージョンを使用することで、最新機能とセキュリティ修正を活用できます。
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.30.0</version> <!-- 最新バージョンを使用 -->
</dependency>
2. Redissonの設定
Redis接続情報を`application.yml`または`application.properties`ファイルに定義します。
2.1. 基本設定
spring:
redis:
host: localhost
port: 6379
password: <null> # パスワードがある場合に指定
database: 0 # データベースインデックス(デフォルトは0)
2.2. カスタム設定
接続プールサイズやタイムアウトをカスタマイズするには、以下の設定クラスを作成します。
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Redisson設定 {
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer()
. setAddress("redis://localhost:6379")
. setPassword("パスワード") // パスワードがある場合は指定
. setDatabase(0)
. setConnectionPoolSize(64) // 最大接続数
. setConnectionMinimumIdleSize(24) // 最小アイドル接続数
. setIdleConnectionTimeout(10000) // アイドル接続タイムアウト(ミリ秒)
. setConnectTimeout(10000) // 接続タイムアウト(ミリ秒)
. setTimeout(3000); // コマンド実行タイムアウト(ミリ秒)
return Redisson.create(config);
}
}
3. 主要なデータ型の操作
3.1. 文字列(String)
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class 文字列サービス {
@Autowired
private RedissonClient redissonClient;
public void 文字列を設定(String レジストリキー, String 値データ) {
RBucket<String> bucket = redissonClient.getBucket(レジストリキー);
bucket.set(値データ);
}
public String 文字列を取得(String レジストリキー) {
RBucket<String> bucket = redissonClient.getBucket(レジストリキー);
return bucket.get();
}
}
3.2. 集合(Set)
import org.redisson.api.RSet;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class 集合サービス {
@Autowired
private RedissonClient redissonClient;
public void 集合に追加(String レジストリキー, String 値データ) {
RSet<String> set = redissonClient.getSet(レジストリキー);
set.add(値データ);
}
public boolean 集合に存在するか(String レジストリキー, String 値データ) {
RSet<String> set = redissonClient.getSet(レジストリキー);
return set.contains(値データ);
}
}
3.3. リスト(List)
import org.redisson.api.RList;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class リストサービス {
@Autowired
private RedissonClient redissonClient;
public void リストに追加(String レジストリキー, String 値データ) {
RList<String> list = redissonClient.getList(レジストリキー);
list.add(値データ);
}
public String リストから取得(String レジストリキー, int インデックス) {
RList<String> list = redissonClient.getList(レジストリキー);
return list.get(インデックス);
}
}
3.4. ハッシュ(Hash)
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ハッシュサービス {
@Autowired
private RedissonClient redissonClient;
public void ハッシュに値を追加(String レジストリキー, String フィールドキー, String 値データ) {
RMap<String, String> map = redissonClient.getMap(レジストリキー);
map.put(フィールドキー, 値データ);
}
public String ハッシュから値を取得(String レジストリキー, String フィールドキー) {
RMap<String, String> map = redissonClient.getMap(レジストリキー);
return map.get(フィールドキー);
}
}
4. 分布型ロックの使用
Redissonは分布型ロックを提供し、複数のスレッドやアプリケーション間での共有リソースの同期を容易にします。
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class ロックサービス {
@Autowired
private RedissonClient redissonClient;
public void タスクをロック付きで実行(String ロックキー) {
RLock lock = redissonClient.getLock(ロックキー);
try {
// ロックを取得(待機タイムアウト10秒、ロック保持タイムアウト60秒)
boolean イスロック = lock.tryLock(10, 60, TimeUnit.SECONDS);
if (イスロック) {
try {
// ビジネスロジック
System.out.println("ロック取得成功:タスクを実行中");
} finally {
lock.unlock();
}
} else {
System.out.println("ロック取得失敗");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
5. 注意事項
- シリアライズ問題: Redissonを使用する際には、オブジェクトのシリアライズに注意してください。`Serializable`インターフェースを実装したオブジェクトを使用するか、Redissonが提供するシリアライザー(例如、`JsonJacksonCodec`)を利用してください。
- 接続管理: 接続プールのパラメータを適切に設定し、接続漏れやパフォーマンス問題を防ぎましょう。
- 例外処理: 分布型ロックを使用する際には、例外を適切に処理し、ロックを確実に解放してください。
- バージョン互換性: RedissonのバージョンがSpring Bootのバージョンと互換性があることを確認してください。