Redissonを用いたSpring Bootアプリケーションの開発ガイド

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のバージョンと互換性があることを確認してください。

タグ: Redisson Spring Boot 分布型ロック データ構造

5月17日 13:24 投稿