sql >> データベース >  >> NoSQL >> Redis

問題のトラブルシューティング

    データ破損の問題のデバッグ#

    デバッグが難しい問題は、同じRedisClientの場合です。 インスタンスは複数のスレッド間で共有されるため、破損したデータが返される可能性があります。通常、これはIRedisClientを使用した結果です。 シングルトンインスタンスのフィールド、または静的インスタンスとして共有します。これを防ぐには、Redisを使用する各スレッドは、usingステートメント内でredisクライアントを取得する必要があります(例:

    )。
    using var redis = redisManager.GetClient();
    //...
    

    残念ながら、破損した応答またはランタイムExceptionを返す呼び出しサイトは、Redisクライアントインスタンスが使用されていた他の場所を識別しません。クライアントインスタンスが使用されている場所を特定しやすくするために、クライアントがプールから解決されたスレッドでのみ使用されていることを表明できます。

    RedisConfig.AssertAccessOnlyOnSameThread = true;
    

    これにより、クライアントがプールから解決されるたびにスレッドのStackTraceがキャプチャされます。これにより、多くのオーバーヘッドが追加されるため、接続の問題をデバッグする場合にのみ有効にする必要があります。

    クライアントが別のスレッドからアクセスされていることを検出した場合、InvalidAccessExceptionをスローします さまざまなスレッドIDを含むメッセージ および元のStackTrace クライアントがプールから解決された場所。これを例外のStackTraceと比較して、クライアントが不適切に使用されている場所を特定できれば幸いです。

    同時使用の問題の回避#

    IRedisClientの複数の同時使用を防ぐためにコードベースで注意すべき点 インスタンス:

    • IRedisClientを使用する using内のインスタンスクライアントをredisします ステートメント
    • 破棄した後はクライアントインスタンスを使用しないでください
    • クライアントが破棄された後は、「サーバーコレクションまたはリソース」(Redis.Lists、ロックなど)を使用(または返却)しないでください
    • シングルトンまたはstaticを絶対に保持しないでください redisクライアントへのインスタンス(IRedisClientsManagerのみ) 工場)
    • 複数のスレッドで同じredisクライアントを使用しないでください。つまり、各スレッドにファクトリから独自のクライアントを解決させます

    1. cURLを悪用してRedisと通信する

    2. 文字列値から空白(先頭と末尾)を削除する

    3. データを失うことなく、mongodbをキャップしたコレクションのサイズを変更するにはどうすればよいですか?

    4. RedisとNode.jsおよびSocket.ioの質問