tencent cloud

Tencent Cloud Distributed Cache (Redis OSS-Compatible)

サンプルコード

ダウンロード
フォーカスモード
フォントサイズ
最終更新日: 2026-10-20 19:07:18
AI翻訳・品質チェック済み

Pom設定

<!-- spring-data-redisコンポーネントを導入します。デフォルトでLettuce依存SDKが統合されています -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.3.0.RELEASE</version>
</dependency>

<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-transport-native-epoll</artifactId>
<version>4.1.100.Final</version>
<classifier>linux-x86_64</classifier>
</dependency>

設定コード

説明:
Lettuce接続プールのLIFO = false(つまりFIFOキュー方式を採用)を設定します。そうしないと、クラウド環境のVIPシナリオでは、接続応答時間の差によって負荷が不均一になり、接続プールが機能しなくなる問題が発生します。
1. デフォルトのLIFO(後入れ先出し)モードは、最後に返却された接続を優先的に再利用するため、応答が速い一部の接続が「ホット接続」となり、応答が遅い接続は長期間アイドル状態になり、バックエンドの実際の負荷が偏ります。
2. 接続プールの機能不全:ある接続が応答の遅延により一時的に破棄されると、LIFOメカニズムは新しいリクエストが少数のアクティブな接続に集中して割り当てられることを悪化させ、単一点のボトルネックリスクを拡大します。

import java.time.Duration;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;

import io.lettuce.core.ClientOptions;
import io.lettuce.core.SocketOptions;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;

@Configuration
public class lettuceSingleConfig {
// @Value("${tencent.redis.host}")
// private String redisHost;
//
// @Value("${tencent.redis.port:6379}")
// private Integer redisPort = 6379;
//
// @Value("${tencent.redis.database:0}")
// private Integer redisDatabase = 0;
//
// @Value("${tencent.redis.password:}")
// private String redisPassword;

@Value("${tencent.redis.connect.timeout:2000}")
private Integer redisConnectTimeout = 2000;

@Value("${tencent.redis.command.timeout:2000}")
private Integer redisCommandTimeout = 2000;
/**
* TCP_KEEPALIVE設定パラメータ
*/
@Value("${tencent.redis.tcp.keepalive.time.idle:30}")
private Integer redisTcpKeepaliveTimeIdle = 30;
@Value("${tencent.redis.tcp.keepalive.time.interval:10}")
private Integer redisTcpKeepaliveTimeInterval = 10;
@Value("${tencent.redis.tcp.keepalive.count:3}")
private Integer redisTcpKeepaliveCount = 3;

/**
* TCP_USER_TIMEOUTはLettuceの長時間タイムアウト問題を解決します。
*/
@Value("${tencent.redis.tcp.user.timeout:30}")
private Integer redisTcpUserTimeout = 30;

/**
* pool関連パラメータ
*/
@Value("${tencent.redis.pool.max-wait:1000}")
private Integer RedisPoolMaxwait = 1000;
@Value("${tencent.redis.pool.max-active:2000}")
private Integer RedisPoolMaxTotal = 2000;
@Value("${tencent.redis.pool.max-idle:1000}")
private Integer RedisPoolMaxIdle = 1000;
@Value("${tencent.redis.pool.min-idle:500}")
private Integer RedisPoolMinIdle = 500;

/**
* redisConnectionFactoryおよび関連パラメータ(Host、Port、Database、Password)とapplication.propertiesの設定方式のいずれかを選択します。
*/
// @Bean
// public LettuceConnectionFactory redisConnectionFactory(LettuceClientConfiguration clientConfiguration) {
//
// RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration();
// standaloneConfiguration.setHostName(redisHost);
// standaloneConfiguration.setPort(redisPort);
// standaloneConfiguration.setDatabase(redisDatabase);
// standaloneConfiguration.setPassword(redisPassword);
//
// LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(standaloneConfiguration, clientConfiguration);
// connectionFactory.setDatabase(redisDatabase);
// return connectionFactory;
// }

@Bean
public LettuceClientConfiguration clientConfiguration() {


SocketOptions socketOptions = SocketOptions.builder()
.keepAlive(SocketOptions.KeepAliveOptions.builder()
// 接続がどのくらいアイドル状態になったらkeepaliveを開始するか
.idle(Duration.ofSeconds(redisTcpKeepaliveTimeIdle))
// 2回のkeepalive間の時間間隔
.interval(Duration.ofSeconds(redisTcpKeepaliveTimeInterval))
// keepaliveが数回行われた後に接続を切断します。
.count(redisTcpKeepaliveCount)
// キープアライブ接続を有効にするかどうか
.enable()
.build())
.tcpUserTimeout(SocketOptions.TcpUserTimeoutOptions.builder()
// サーバー側のrstによる長時間タイムアウト問題を解決します。
.tcpUserTimeout(Duration.ofSeconds(redisTcpUserTimeout))
.enable()
.build())
// tcp接続タイムアウト設定
.connectTimeout(Duration.ofMillis(redisConnectTimeout))
.build();

ClientOptions clientOptions = ClientOptions.builder()
.autoReconnect(true)
.pingBeforeActivateConnection(true)
.cancelCommandsOnReconnectFailure(false)
.disconnectedBehavior(ClientOptions.DisconnectedBehavior.ACCEPT_COMMANDS)
.socketOptions(socketOptions)
.build();

// 接続プール設定を作成し、LIFOを無効にします。
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setLifo(false); // LIFOを無効にし、FIFOモードを有効にします。
poolConfig.setMaxTotal(RedisPoolMaxTotal); // オプション:最大接続数を設定します。
poolConfig.setMaxIdle(RedisPoolMaxIdle); // オプション:最大アイドル接続数を設定します。
poolConfig.setMinIdle(RedisPoolMinIdle); // オプション:最小アイドル接続数を設定します。
poolConfig.setMaxWait(Duration.ofMillis(RedisPoolMaxwait));

return LettucePoolingClientConfiguration.builder()
.poolConfig(poolConfig)
.commandTimeout(Duration.ofMillis(redisCommandTimeout))
.clientOptions(clientOptions)
.build();
}
}

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック