org.springframework.dao.QueryTimeoutException: Redis command timed out;
nested exception is io.lettuce.core.RedisCommandTimeoutException:
Command timed out after 1 minute(s)
今日仕事でプロジェクトを開いたところ、突然このエラーが報告されたことに気付き、自分のコードを確認したところ、問題はありませんでした。
そこで私は解決策を探し始めました。
問題の原因:
1. Redis が長時間にわたって高い同時実行状態になっているか、サービスが異常に切断されている可能性があります。
2. Redis 構成内の負の数により接続チャネルが閉じられる可能性があります。
3. springboot2.x である可能性があります。springBoot によってデフォルトで使用される Redis クライアントは、jedis および lettuce 接続プールではなく lettuce です。
知識を普及させます:
spring-data-redis には、jedis と lettuce という 2 つの組み込みドライバーがあります。springboot1.X バージョンのデフォルトは jedis 実装で、springboot2.X のデフォルトは lettuce 実装です。レタスは切断されると再接続するメカニズムがないため、最終的にはタイムアウトになります。
lettuce: netty に基づいており、スレッドセーフですが、デフォルトではインスタンスが 1 つだけです。
ほとんどの人は、springBoot Redis 構成設定のタイムアウトを設定すると言います: timeout
実際、どれだけ長く設定しても、接続チャネルが閉じられて再接続できないためタイムアウトになります。次に、max-wait が負の値 (永続的な待機) に設定されている場合、接続を生成できません。
解決:
POMを調整、レタスを除外、ジェディスを使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
YMLパラメータを調整する
redis:
# 连接超时 毫秒
connectTimeout: 1800
# 连接超时时间
timeout: 60s
host: 127.0.0.1
port: 6379
database: 1
password:
jedis:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: 3600ms
上記はすべて個人的な解決策です。この記録に間違いがあれば修正してください。