2017-08-24 8 views
0

私は1つのマスターと2つのスレーブを持つredis HAを持っています。私は赤ちゃんに約1000万の鍵を持っています。 特定のフローについては、バッチサイズが1000で約1百万のキーを削除しています。他のフローキーでも同様に、キーは赤字になります。 しかし、削除操作を実行するたびに、java.net.SocketTimeoutExceptionが発生します。読み取りがタイムアウトしました。私は8秒でタイムアウトを維持しています。Redis Deleteに問題はありますか?1ミリ秒の鍵を削除する際にタイムアウト例外を読み取る

私はJedis cleint 2.7を使用しています。

スタックトレース: "redis.clients.jedis.exceptions.JedisConnectionException:java.net.SocketTimeoutException:読み取りがタイムアウト":{
「RedisInputStream.java:201":"redis.clients.util.RedisInputStream。 "Refill"、 "RedisInputStream.java:40":"redis.clients.util.RedisInputStream.readByte"、 "Protocol.java:141":"redis.clients.jedis.Protocol.process"、 "Protocol.java :205 ":" redis.clients.jedis.Protocol.read "、 " Connection.java:297":"redis.clients.jedis.Connection.readProtocolWithCheckingBroken "、 " Connection.java:267":"redis.clients .jedis.Connection.getAll "、 " Connection.java:259":"redis.clients.jedis.C onnection.getAll "、

+0

コードを共有できますか?さらにスタックトレース? – sazzad

答えて

0

redisサーバーはプロセス要求のための単一スレッドモデルであるためです。したがって、すべてのコマンド受信は、1つずつ待ち行列に入れられます。

DEL操作については、キースペースからキーを削除するだけでなく、キーのすべてのメモリが解放されるまでブロックされます。だからあなたの赤いサーバを遅くする。あなたはUNLINKコマンドを試すことができます。

このコマンドは、DELと非常によく似ています。指定されたキーを削除します。 DELのように、キーが存在しなければ無視されます。しかし、コマンドは別のスレッドで実際のメモリ再生を実行するため、DELはブロックされていません。これはコマンド名の由来です。コマンドはキースペースからキーのリンクを解除するだけです。実際の削除は後で非同期で行われます。

EDITED。

多分あなたは徐々に削除し、段階的に入れてみるべきです。例えば。 1分ごとに100個のキーまたは1000個のキーを削除します。

あなたのキーの種類が巨大なデータを保持するリストやセット、またはzsetである場合は、遅延したものを削除し、最初にそれらを収集してから、redisがあまりビジーでないときに削除することがあります。

あなたのputデータフローがこの大量のデータをredisに読み込んだ場合、インクリメンタルに配置します。

+0

すぐにお返事ありがとうございます。しかし、Redisの3.0.7バージョンを使用しています。 3.0.7の他の方法がありますか – user3134614

+0

編集された答えがあなたに役立つかどうかはあまりよく分かりません。 – GuangshengZuo

関連する問題