すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):一般的なエラーとトラブルシューティング

最終更新日:Sep 12, 2024

このトピックでは、TairおよびApsaraDB for Redisの一般的なエラーについて説明し、これらのエラーの解決策を提供します。

エラー

データ型

エラーメッセージ

一般的なRedisエラー

プロキシモードのインスタンスの一般的なエラー

Luaスクリプトおよびトランザクションに関連するエラー

Jedisエラー

レタスエラー

Redisonエラー

Spring Data Redisエラー

StackExchange.Redisエラー

Predisエラー

phpredisエラー

go-redisエラー

node-redisエラー

一般的なRedisエラー

ERR違法アドレス

考えられる原因: クライアントのIPアドレスが ApsaraDB for Redisインスタンスのホワイトリストに追加されていません。

解決策: クライアントのIPアドレスを ApsaraDB for Redisインスタンスのホワイトリストに追加します。 詳細については、「」「接続の診断の実行」をご参照ください。

ERRセンチネル互換モードが無効になっている

考えられる原因: ApsaraDB for RedisインスタンスでSentinel互換モードが有効になっていません。

解決策: コンソールでインスタンスのSentinel互換モードを有効にします。 詳細については、「」「センチネル互換モードの有効化」をご参照ください。

到達したクライアントのERR最大数

考えられる原因: ApsaraDB for Redisインスタンスへの最大接続数に達しています。

解決策:

  • クライアントで接続リークが発生していないか確認します。 たとえば、JedisクライアントでJedisPoolが使用された後にclose関数が呼び出されるかどうかを確認します。

  • 現在の接続セッションが期待どおりに実行されるかどうかを確認します。 詳細については、「」「インスタンスセッション」をご参照ください。 セッションを終了するか、インスタンス設定をアップグレードして、インスタンスへの最大接続数を増やすことができます。

NOAUTH認証が必要

考えられる原因: ApsaraDB for Redisインスタンスにパスワードベースの認証が設定されていますが、クライアントがパスワードを提供しないか、誤ったパスワードを提供します。

解決策: 正しいアカウントのユーザー名とパスワードを使用してインスタンスに接続します。 詳細については、「」「ログオン方法」をご参照ください。

説明

インスタンスにSentinel互換モードが有効になっている場合は、Sentinel互換モードを使用してApsaraDB for Redisインスタンスに接続するトピックを参照してください。

WRONGPASS無効なユーザー名とパスワードのペア

考えられる原因: パスワードが無効です。

解決策: 正しいアカウントのユーザー名とパスワードを使用してインスタンスに接続します。 詳細については、「」「ログオン方法」をご参照ください。

説明

インスタンスにSentinel互換モードが有効になっている場合は、Sentinel互換モードを使用してApsaraDB for Redisインスタンスに接続するトピックを参照してください。

ERR無効なパスワード

考えられる原因: パスワードが無効です。

解決策: 正しいアカウントのユーザー名とパスワードを使用してインスタンスに接続します。 詳細については、「」「ログオン方法」をご参照ください。

説明

このエラーがデータ管理 (DMS) で報告された場合、考えられる原因は、前回のログイン中にDMSによって保存されたパスワードがインスタンスの現在のパスワードと一致しないことです。 DMSのインスタンスリストでインスタンスを見つけ、[操作] 列の [詳細]> [編集] を選択します。 次に、[データベースパスワード] フィールドに新しいパスワードを入力して、もう一度お試しください。

Connection reset by peer

考えられる原因: クライアントバッファの例外により接続が閉じられます。

解決策: アプリケーションコードを確認するか、クライアントバッファのサイズを変更します。 詳細については、このトピックの「予期しないストリームの終了」セクションを参照してください。

UnknownHostException

または、failed to connect: xxx.redis.rds.aliyuncs.com could not be resolvedエラーが発生します。

考えられる原因: クライアントが ApsaraDB for Redisインスタンスのドメイン名を解決できません。

解決策: DNSサーバーを正しく設定します。 詳細については、「DNS解決の失敗による接続の問題のトラブルシューティング」をご参照ください。

メモリを使用している場合、OOMコマンドは許可されません> 'maxmemy'

考えられる原因: ApsaraDB for Redisインスタンスに設定された最大メモリに達しました。

説明

ApsaraDB for Redisインスタンスがクラスターアーキテクチャを使用している場合、データシャードのメモリ使用量がデータシャードに設定された最大メモリを超える可能性があります。

解決策:

  • インスタンスのメモリ使用量が100% に達した場合は、インスタンス設定をアップグレードすることを推奨します。 詳細については、「」「インスタンスの設定の変更」をご参照ください。

  • 単一のデータシャードのメモリ使用量が100% に達すると、インスタンスに大きなキーが存在する可能性があります。 オフラインキー分析またはインスタンス診断機能を使用して原因を特定できます。

WRONGTYPE間違った種類の値を保持しているキーに対する操作

考えられる原因: 間違ったコマンドが実行されます。 たとえば、HASHコマンドは文字列で実行されます。

解決策: 誤ったコードを変更するか、正しいコマンドを使用してください。 詳細については、「コマンド」をご参照ください。

ERR unknownコマンド 'xxx'

考えられる原因: 実行したコマンドが ApsaraDB for Redisに存在しません。

解決策: インスタンスのバージョンがコマンドをサポートしているかどうかを確認します。 詳細については、「」「ApsaraDB For Redis Community Editionでサポートされているコマンド」をご参照ください。

説明

最新のマイナーバージョンは、より多くの機能とより高い安定性を提供します。 インスタンスを最新のマイナーバージョンに更新することを推奨します。 詳細については、「」「インスタンスのマイナーバージョンの更新」をご参照ください。

ERRコマンド 'xxx' はアカウントをサポートしていません

考えられる原因: ApsaraDB for Redisの特定のコマンドがAlibaba Cloudで無効になっているか、#no_loose_disabled-commandsで指定されています。 詳細については、ApsaraDB For Redis Community Editionでサポートされているコマンドおよび高リスクコマンドの無効化をご参照ください。

解決策: #no_loose_disabled-commandsで指定された無効化されたコマンドから実行するコマンドを削除します。

NOPERMこのユーザーには 'xxx' を実行する権限がありません

考えられる原因: ApsaraDB for Redisの特定のコマンドがAlibaba Cloudで無効になっているか、#no_loose_disabled-commandsで指定されています。 詳細については、ApsaraDB For Redis Community Editionでサポートされているコマンドおよび高リスクコマンドの無効化をご参照ください。

解決策: #no_loose_disabled-commandsで指定された無効化されたコマンドから実行するコマンドを削除します。

ERR FLUSHDBは移行モードでは使用できません

考えられる原因: クラウドディスクベースの ApsaraDB for Redisクラスターインスタンスのデータシャードの数が変化している場合、FLUSHDBおよびFLUSHALLコマンドは無効になっています。

解決策: ApsaraDB for Redisインスタンスの変更が終了するまで待ちます。 詳細については、「」「インスタンスのシャード数の調整」をご参照ください。

リクエスト内のCROSSSLOTキーは同じスロットにハッシュされません

考えられる原因: DELMSETMGETなど、スロット間で複数のキーを含むコマンドは、直接接続モードの Tairクラスターインスタンスではサポートされていません。

解決策:

  • 複数のキーを含むコマンドを実行する前に、CLUSTER KEYSLOTコマンドを使用して、すべてのキーが同じスロットにあることを確認します。

  • キー名を変更し、ハッシュタグを実装して、関連するキーが同じスロットに割り当てられるようにします。 ただし、ハッシュタグを使用する場合は、データスキューを防ぐことが重要です。 詳細については、「ハッシュタグ」をご参照ください。

  • インスタンスを、DELMGETMSETなど、スロット間で複数のキーを含むコマンドをサポートするプロキシモードのクラスターインスタンスに変更します。 詳細については、「」「プロキシノードの機能」をご参照ください。

読み取り専用インスタンスに対して書き込みができないERR READONLY

考えられる原因: ApsaraDB for Redisインスタンスのマスターレプリカ切り替え、構成変更、またはマイナーバージョンの更新中に、一時的な接続が発生し、インスタンスは最大30秒間読み取り専用になります。

解決策: インスタンスが回復するまで待ちます。 手動操作は必要ない。 アプリケーションの再接続と例外処理メカニズムを設計します。 詳細については、「」「インスタンスの設定の変更」をご参照ください。

プロキシモードのインスタンスの一般的なエラー

ERRクライアントipがホワイトリストにない

考えられる原因: クライアントのIPアドレスが ApsaraDB for Redisインスタンスのホワイトリストに追加されていません。

解決策: クライアントのIPアドレスを ApsaraDB for Redisインスタンスのホワイトリストに追加します。 詳細については、「」「接続の診断の実行」をご参照ください。

NOWRITE非書き込みredisに対して書き込むことはできません

または、NOREAD You can't read against a non-read redisエラーが発生します。

考えられる原因: インスタンスの料金滞納または期限切れです。 インスタンスは ロック済 状態です。

解決策: アカウントに資金を追加するか、インスタンスを更新します。 詳細については、「」「有効期限と延滞支払い」をご参照ください。

ERR構文エラー

考えられる原因: 実行するコマンドに構文の誤りがあります。 たとえば、このコマンドでは4つのパラメーターが必要ですが、指定するパラメーターは3つだけです。

解決策: コマンド構文が有効かどうかを確認します。 詳細については、「コマンド」をご参照ください。

ERRそのようなdbノードなし

考えられる原因: ApsaraDB for Redisの社内コマンドを実行すると、指定されたdb nodeパラメーターが無効です。

解決策: db nodeパラメーターを正しく指定します。 db nodeの値は、インスタンス内のデータシャードの数未満である必要があります。 詳細については、「」「プロキシモードのApsaraDB For Redisインスタンスの社内コマンド」をご参照ください。

ERR 'xxx' コマンドキーは同じスロットになければなりません

コマンドの要求されたキーが同じスロットに格納されていません。 トランザクションまたはスクリプトを使用して ApsaraDB for Redisクラスターインスタンスでコマンドを実行する場合、要求されたキーは同じスロットにある必要があります。

解決策: トランザクションまたはスクリプトを変更します。 CLUSTER KEYSLOTコマンドを使用して、要求されたキーが格納されているスロットを照会できます。

重要

ApsaraDB for Redisクラスターインスタンスは、Cyclic Redundancy Check (CRC) アルゴリズムを使用して、異なるスロットにキーを均等に分散します。 同じスロットにキーを格納する場合は、ハッシュタグを使用できます。 しかし、これはデータスキューを引き起こす可能性がある。 作業は慎重に行ってください。 ハッシュタグの詳細については、「ハッシュタグ」をご参照ください。

redisクラスターのERR、eval/evalshaキーの数は負またはゼロにすることはできません

考えられる原因: EVALおよびEVALSHAコマンドで、キーが指定されていないか、numkeysパラメーターが0以下に設定されています。

解決策: EVALコマンドとEVALSHAコマンドを使用する場合は、少なくとも1つのキーを指定し、numkeysパラメーターを0より大きい値に設定する必要があります。 詳細については、「」「Luaスクリプトの使用方法」をご参照ください。

ERRリクエストが拒否され、保留中のリクエストが多すぎて、xxxがカウントされ、しきい値xxxを超えました

考えられる原因: クライアントが無効なパイプラインを使用しているため、保留中のリクエストが ApsaraDB for Redisのバックエンドに蓄積されます。

解決策: パイプライン化されたリクエストの数を減らします。

ERR redisの一時的な障害

考えられる原因: ApsaraDB for Redisインスタンスの子インスタンスに接続すると、ネットワークジッタ、過剰な接続、マスターレプリカの切り替え、または進行中の低速クエリによりタイムアウトエラーが発生します。

解決策: インスタンスが回復するまで待ちます。 手動操作は必要ない。 アプリケーションの再接続と例外処理メカニズムを設計します。

ERR redisの一時的な障害 (ErrorCode 7002)

考えられる原因: ApsaraDB for Redisインスタンスの子インスタンスに接続すると、進行中のインスタンス設定変更またはマスターレプリカの切り替えによりタイムアウトエラーが発生します。

解決策: インスタンスが回復するまで待ちます。 手動操作は必要ない。 アプリケーションの再接続と例外処理メカニズムを設計します。

Luaスクリプトおよびトランザクションに関連するエラー

NOSCRIPT一致するスクリプトはありません。 EVALをご利用ください。

考えられる原因: EVALSHAコマンドを実行すると、SHA1値に対応するスクリプトが ApsaraDB for Redisインスタンスにキャッシュされません。

解決策: EVALまたはSCRIPT LOADコマンドを実行して、必要なスクリプトを ApsaraDB for Redisインスタンスにキャッシュし、再試行します。 詳細については、「」「NOSCRIPTエラーの処理」をご参照ください。

BUSY Redisはスクリプトの実行に忙しいです。 SCRIPT KILLまたはSHUTDOWN NOSAVEのみを呼び出すことができます。

考えられる原因: Luaスクリプトがタイムアウトしました。

解決策: SCRIPT KILLコマンドを実行して、スクリプトの実行を終了するか、実行が終了するまで待ちます。 詳細については、「」「Luaスクリプトのタイムアウトの処理」をご参照ください。

ERRコマンドeval not support for normal user

考えられる原因: EVAL関連のコマンドを実行できません。

解決策: インスタンスを最新のマイナーバージョンに更新します。 詳細については、「」「インスタンスのマイナーバージョンの更新」をご参照ください。

ERR eval/evalshaコマンドキーは同じスロットになければなりません

考えられる原因: Luaスクリプトに含まれるキーが同じスロットに存在しない。 このエラーは、クラスターインスタンスで一般的です。

解決策: Luaスクリプトを変更します。 CLUSTER KEYSLOTコマンドを実行して、キーが存在するスロットを照会できます。 詳細については、「」「クラスターインスタンスのLuaスクリプトの制限」をご参照ください。

redisクラスターのERR bad luaスクリプトの場合、スクリプトが使用するすべてのキーはkeys配列を使用して渡す必要があります。

考えられる原因: このエラーは、Luaスクリプト上のプロキシノードの制限によって引き起こされる可能性があります。

解決策: 配列内のすべてのキーを指定します。 例: EVAL "retur n redis.ca ll('mget', KEYS[1], KEYS[2])" 2 foo {foo}bar キーはLua変数に置き換えることはできません。 詳細については、「」「クラスターインスタンスのLuaスクリプトの制限」をご参照ください。

以前のエラーのために破棄されたEXECABORTトランザクション

考えられる原因: トランザクションで実行するコマンドに構文の誤りまたはエラーがあります。

解決策: コードロジックを確認し、コマンドの構文ミスを修正します。

UNKILLABLEスクリプトは既にデータセットに対して書き込みコマンドを実行しています。

考えられる原因: 現在のLuaスクリプトに含まれる書き込み操作が実行されました。 この場合、SCRIPT KILLコマンドは実行できません。

解決策: コンソールでインスタンスを見つけ、[操作] 列の [再起動] をクリックします。 詳細については、「」「インスタンスの再起動」をご参照ください。

UNKILLABLEビジースクリプトは、レプリケーションのコンテキストでマスターインスタンスによって送信されたため、破棄できません。

考えられる原因: 現在のLuaスクリプトは、マスターノードによって対応するレプリカノードに転送されます。 この場合、SCRIPT KILLコマンドは実行できません。

解決策: コンソールでインスタンスを見つけ、[操作] 列の [再起動] をクリックします。 詳細については、「」「インスタンスの再起動」をご参照ください。

NOTBUSY現在実行中のスクリプトはありません。

考えられる原因: Luaスクリプトが実行されていません。

解決策: 手動操作は必要ありません。 SCRIPT KILLコマンドを実行しないでください。

Jedisエラー

プールからリソースを取得できませんでした

考えられる原因: Jedis接続をJedisPoolから借用できません。

  • blockWhenExhaustedパラメーターがtrueに設定されている場合、JedisPoolから使用できる接続がない場合、クライアントはmaxWaitMillisパラメーターで指定された数ミリ秒待機します。 クライアントが長時間待機しても使用可能なJedis接続を取得できない場合は、次の例外がスローされます。

    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
        ...
    Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
  • blockWhenExhaustedパラメーターがfalseに設定されている場合、JedisPoolから使用可能な接続がない場合、次の例外がスローされます。

    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
        ...
    Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)

解決策: エラーのトラブルシューティングには、次の点を考慮してください。

  • 接続リーク

    デフォルトでは、maxTotalは8に設定されています。 次のコードは、JedisクライアントがJedisPoolからの接続を8回借用しますが、これらの接続は返さないことを示しています。 このため、Jedisクライアントは、jedisPoolから別の接続を取得する9回目の試行でJedisPool. getResource().ping() コマンドを実行できません。

    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);
    // The client borrows connections from JedisPool for eight times, but does not return these connections. 
    for (int i = 0; i < 8; i++) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.ping();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }
    jedisPool.getResource().ping();

    推奨コード:

    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        // The command that you want to run. 
        jedis.executeCommand()
    } catch (Exception e) {
        // If the command involves a key, we recommend that you make configurations to display the key in error logs. This way, you can use the key to identify the data node on which issues occur. 
        logger.error(e.getMessage(), e);
    } finally {
        // The client does not close a borrowed connection. Instead, the client returns the connection to JedisPool. 
        if (jedis != null) 
            jedis.close();
    }
  • maxTotalパラメーターの小さな値

    システムで同時実行で処理される多数の操作がある場合、maxTotalパラメーターの値が小さいと例外が発生する可能性があります。 例えば、平均してコマンドを実行するのに約1 msかかる。 これは、次の式を使用して計算されます。リソースの借用または返却に費やされた時間 + Jedisがコマンドを実行するのに費やされた時間 + ネットワークレイテンシ。 接続の1秒あたりのクエリ数 (QPS) は約1,000で、予想される合計QPSは50,000です。 理論的には、予想されるQPS 50,000を達成するには、maxTotal値50が必要です。 maxTotal値は、50,000を1,000で割ることによって得られる。

    この場合、クライアントで次のコマンドを実行して、クライアント接続の数を取得できます。 取得した値に基づいて、maxTotalの値を調整できます。

    netstat -an | grep 6379 | grep EST | wc -l
  • 接続ブロッキング

    低速クエリなどの理由で ApsaraDB for Redisインスタンスへの接続がブロックされた場合、すべての接続は指定されたタイムアウト期間内に待機します。 この場合、多数の操作が並行して処理されると、タイムアウトエラーが報告される可能性があります。 詳細については、「」をご参照ください。java.net: 接続タイムアウト.

  • 接続拒否

    JedisPoolから接続を取得しようとすると、利用可能な接続がない場合、JedisはJedis接続を作成しようとします。 ただし、接続の試行は拒否され、例外がスローされます。 例:

    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
        at redis.clients.util.Pool.getResource(Pool.java:50)
        at redis.clients.jedis.JedisPool.getResource(JedisPool.java:99)
        at TestAdmin.main(TestAdmin.java:14)
    Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused
        at redis.clients.jedis.Connection.connect(Connection.java:164)
        at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:80)
        at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1676)
        at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:87)
        at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:861)
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
        at redis.clients.util.Pool.getResource(Pool.java:48)
        ... 2 more
    Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at redis.clients.jedis.Connection.connect(Connection.java:158)
        ... 9 more

    at redis.clients.jedis.Connection.connect(Connection.java:158) は、Jedisがソケット接続の作成とconnect関数の呼び出しを試みますが、接続の試みは拒否されます。 Jedisソースコード:

    socket.setSoLinger(true, 0); 
    158:  socket.connect(new InetSocketAddress(host, port), connectionTimeout);

    通常、この問題に対処するには、 ApsaraDB for Redisインスタンスのドメイン名設定が正しいかどうかを確認し、対応する期間内のネットワーク接続を確認する必要があります。

java.net.SocketTimeoutException: connect timed out

考えられる原因: クライアントと ApsaraDB for Redisインスタンス間の接続がタイムアウトしました。

解決策: を参照してください。ApsaraDB for Redisの接続の問題をトラブルシューティングするにはどうすればよいですか。 トピックを使用します。

java.net.SocketTimeoutException: Read timed out

考えられる原因: 不安定なネットワーク接続、短い読み取り /書き込みタイムアウト期間、低速クエリ、または接続ブロックにより、Jedis API呼び出しがタイムアウトしました。

解決策: タイムアウト期間を長くするか、インスタンス診断を実行して、パフォーマンスの問題または例外が対応する時点で発生しているかどうかを確認します。

説明

DMSでこのエラーが発生した場合、インスタンスのVPCエンドポイントまたはポートが変更されている可能性があります。 DMSのインスタンスリストでインスタンスを見つけ、[操作] 列の [詳細]> [編集] を選択します。 表示されるダイアログボックスで、[接続方法][接続文字列アドレス] に設定します。 次に、[接続文字列アドレス] フィールドに新しいエンドポイントを入力して、もう一度お試しください。

クラスターに到達可能なノードがありません

考えられる原因: JedisClusterにアクセスできません。

解決策: クライアントが初めて ApsaraDB for Redisインスタンスに接続するときに、クライアントのIPアドレスが ApsaraDB for Redisインスタンスのホワイトリストに追加されているかどうかを確認します。 ApsaraDB for Redisインスタンスに初めて接続しない場合は、インスタンス診断を実行して原因を特定します。

原因: java.lang.NumberFormatException: 入力文字列: "6379 @ 13028"

考えられる原因: cluster slotsの出力を解決するために、Jedis 2.8.0以前でClusterNodeInformationParserが導入されました。 ただし、オープンソースのRedisは出力のタイプを変更しました。 これが、NumberFormatExceptionエラーが報告される理由です。

解決策: Jedisを2.9.0以降に更新します。

クラスター試行が残っていない

考えられる原因: API呼び出しがタイムアウトし、5回の再試行も失敗しました。 デフォルトでは、API呼び出しがタイムアウトした後、JedisClusterは5回再試行します。

解決策: タイムアウト期間を長くするか、インスタンス診断を実行します。

予期しないストリームの終わり

考えられる原因: Jedisクライアントバッファで例外が発生しました。 エラーのトラブルシューティングには、次の点を検討できます。

  • 1つの接続を共有する複数のスレッド

    通常、1つのスレッドは1つのJedis接続を使用します。 次のコードは、2つのスレッドが1つのJedis接続を共有することを示しています。

    new Thread(new Runnable() {
        public void run() {
            for (int i = 0; i < 100; i++) {
                jedis.get("hello");
            }
        }
    }).start();
    new Thread(new Runnable() {
        public void run() {
            for (int i = 0; i < 100; i++) {
                jedis.hget("haskey", "f");
            }
        }
    }).start();

    この問題を防ぎ、スレッドのセキュリティを確保するには、JedisPoolを使用してJedis接続を管理します。

  • 長時間アイドル接続

    サーバーは長時間のアイドル接続を閉じます。 インスタンスのタイムアウト設定とJedisPoolの関連設定を照会して、長時間のアイドル接続を定期的にチェックおよびクリーンアップするかどうかを判断します。

    説明

    デフォルトでは、 ApsaraDB for Redisは長時間のアイドル接続を閉じません。 timeoutパラメーターの値を変更すると、このエラーが報告される場合があります。 詳細については、「」「アイドルクライアント接続のタイムアウト期間の設定」をご参照ください。

解決策: 複数のスレッドがJedisコードを共有するかどうか、またはサーバーが長時間のアイドル接続を閉じるかどうかを確認します。

java.lang.Longはjava.util.Listにキャストできません

考えられる原因: このエラーは、同じJedis接続が複数のスレッド間で共有されている場合に報告されます。 これは、Jedis自体がスレッドセーフではなく、複数のスレッドで同時に使用してはならないためです。

解決策: 単一のスレッドで1つのJedis接続を使用します。 さらに言えば、JedisPoolを使用できます。

壊れたパイプ (書き込みに失敗)

考えられる原因: Jedisクライアントでシングル接続モードでタイムアウトエラーが発生し、クライアントがソケットを閉じた後、インスタンスにデータを書き込み続けます。

解決策: 単一のスレッドで1つのJedis接続を使用します。 さらに言えば、JedisPoolを使用できます。

キーのスロットが異なるため、このコマンドをRedis Clusterにディスパッチする方法はありません

考えられる原因: JedisClusterは、異なるスロットにあるキーに対して操作を実行します。

解決策: ハッシュタグを使用してキーを変更します。 詳細については、「ハッシュタグ」をご参照ください。

説明

プロキシモードを使用して、クラスターアーキテクチャの制限を無効にすることもできます。

レタスエラー

xxxへの接続は許可されていません。 このパーティションは、クラスタービューでは認識されません。

考えられる原因: デフォルトでは、validateClusterNodeMembershipがtrueに設定され、refreshOptionがnullに設定されています。 ApsaraDB for Redisインスタンスのルーティングアドレスが変更された後、refreshOptionがnullに設定されているため、ルートテーブルは更新されません。 この場合、エラーはvalidateClusterNodeMembershipで報告されます。

解決方法: refreshOptionパラメーターを指定し、validateClusterNodeMembershipパラメーターをfalseに設定します。 詳細については、「」「レタス」をご参照ください。

io. leutter. core.RedisConnectionException: xxxに接続できません

考えられる原因: クライアントと ApsaraDB for Redisインスタンス間の接続がタイムアウトしました。

解決策: を参照してください。ApsaraDB for Redisの接続の問題をトラブルシューティングするにはどうすればよいですか。 トピックを使用します。

java.nio.channels.UnresolvedAddressException

考えられる原因: このエラーは、おそらくNettyのバージョンが原因で発生します。

解決策: Nettyのバージョンを確認してください。 新しいバージョンを使用することを推奨します。 詳細については、『GitHub』をご参照ください。

ERR不明歩哨サブコマンド「マスター」

考えられる原因: master-replica Sentinelモードでは、LettuceクライアントがSentinel master/slaveコマンドを ApsaraDB for Redisインスタンスに送信します。 ただし、Sentinel互換モードのインスタンスは、Sentinel get-master-addr-by-nameコマンドのみをサポートします。

解決策: コードを変更して、Sentinel以外のモードに切り替えます。 ApsaraDB for Redisは、社内の高可用性コンポーネントを使用します。 Sentinel互換モードを使用する必要はありません。

不明なコマンド: 一部のインスタンスバージョンはRESP3プロトコルをサポートしていません

考えられる原因: Redis 6.0以降はRESP3プロトコルをサポートしています。 HELLOコマンドを実行して、接続を目的のRESPプロトコルバージョンに切り替えることができます。 ただし、以前のバージョンの一部のインスタンスはHELLOコマンドをサポートしていないため、互換性の問題が発生します。

解決策: RESP2プロトコルを使用して ApsaraDB for Redisインスタンスにアクセスするようにプログラムを設定できます。 例:

client.setOptions(ClientOptions.builder())
    . protocolVersion(ProtocolVersion.RESP2)
    . build(); 

Spring Data Redis with LettuceがRedisクライアントとして使用されている場合の例:

LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder().
    clientOptions(ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build()).build();

return new LettuceConnectionFactory(redisClusterConfiguration, lettuceClientConfiguration);

Redisonエラー

org.redisson.client.RedisConnectionException: Redisサーバーxxxに接続できません

考えられる原因: クライアントと ApsaraDB for Redisインスタンス間の接続がタイムアウトしました。

解決策: を参照してください。ApsaraDB for Redisの接続の問題をトラブルシューティングするにはどうすればよいですか。 トピックを使用します。

enum定数org.redisson.cluster.ClusterNodeInfo.Flag.NOFAILOVER

考えられる原因: このRedissonバージョンにバグが存在します。 詳細については、『GitHub』をご参照ください。

解決策: Redissonクライアントを3.11.6以降に更新します。

Spring Data Redisエラー

NOPERMこのユーザーには 'config | get' コマンドを実行する権限がありません

考えられる原因: インスタンスのバージョンが [インスタンス情報] ページにRedis 7.0として表示されます。 Redis 7.0を実行するTairおよびApsaraDB for Redisインスタンスでは、CONFIGコマンドが無効になっています。

アプリケーションが起動すると、Spring Data RedisはCONFIG SETコマンドを実行して、notify-keyspace-eventsパラメーターを動的に設定し、KeyspaceEventMessageListener機能を有効にします。 この場合、CONFIG SETコマンドが無効になっているため、アプリケーションは起動時にエラーをスローします。

解決策: 次の方法を使用して、keyspaceNotificationsConfigParameterを空のままにして、この問題を回避します。 SpingRedisTestの例を参照できます。 詳細については、「Spring Data Redis」をご参照ください。

@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP, keyspaceNotificationsConfigParameter = "")

StackExchange.Redisエラー

このサーバーでは複数のデータベースがサポートされていません。

考えられる原因: クラスターインスタンスではSELECTコマンドがサポートされていません。

解決策: cluster_compat_enableパラメーターを0に設定して、オープンソースのRedisクラスター構文との互換性を無効にします。 次に、クライアントを再起動して、もう一度お試しください。 詳細については、「」「インスタンスパラメーターの設定」をご参照ください。

Predisエラー

サーバーから行を読み取る際にエラーが発生しました。

考えられる原因: 読み取り要求がタイムアウトしました。 遅いクエリが進行中である可能性があります。

解決策: タイムアウト時間を長くするか、read_write_timeout0または -1に設定します。 詳細については、「Predisの質問」をご参照ください。

phpredisエラー

要求されたアドレスを割り当てできません

考えられる原因: クライアントは、短期間の接続で ApsaraDB for Redisインスタンスに接続します。

解決策: クライアントがデプロイされているECS (Elastic Compute Service) インスタンスのconnectの代わりにpconnectを使用するか、tcp_max_tw_bucketsパラメーター値を変更します。 詳細については、「」をご参照ください。短期間の接続でApsaraDB for Redisにアクセスしたときに「要求されたアドレスを割り当てできません」エラーが返された場合はどうすればよいですか?

redisプロトコルエラー、応答タイプバイトとして '' を取得

考えられる原因: このphpredisバージョンにバグが存在します。 詳細については、『GitHub』をご参照ください。

解決策: phpredisクライアントを最新バージョンに更新します。

php_network_getaddresses: getaddrinfo failed: 名前解決の一時的な失敗

解決策: DNSサーバーを正しく設定します。 詳細については、「DNS解決の失敗による接続の問題のトラブルシューティング」をご参照ください。

考えられる原因: クライアントが ApsaraDB for Redisインスタンスのドメイン名を解決できません。

go-redisエラー

パニック: クラスター情報アドレスに4つの要素があり、予想2または3

考えられる原因: go-redisクライアントのバージョンがRedis 7.0以降と互換性がありません。 詳細については、『GitHub』をご参照ください。

解決策: go-redis 9.0または後で使用します。

node-redisエラー

SCANコマンドは無限ループで実行されるか、空の結果を返します

考えられる原因: SCANコマンドによって返されるカーソル値が、JavaScript (Number.MAX_SAFE_integer) で正確に表すことができる最大の整数値を超えている可能性があります。 これにより、カーソル値が不正確になり、無限ループにつながる可能性があります。 詳細については、『GitHub』をご参照ください。

解決策: node-redisクライアントを5.0.0以降に更新します。