1. ホーム
  2. データベース
  3. レディス

Redisのkeysコマンドの遅さ

2022-01-15 19:57:03

keysコマンドの使用方法。

keys pattern

正規表現にマッチするキーのリストを検索します。スキャンはRedisサービス内のすべてのキーに対して行うので、よく考えると遅いですよね?
keysコマンドを同時に実行している間は、Redisプロセスは他のコマンドの実行をブロックされ、センチネルを超えると down-after-milliseconds code down-after-milliseconds /codeの設定を超えた場合、マスタースレーブ切り替えが発生し、切り替え中にマスターノードが正常な状態に戻れば、脳骨折などのトラブルも続出する可能性があります。

そのため、本番環境では、keysコマンドを直接無効化することをお勧めします。

Keysコマンドの代替

1.スキャンスキャンでブロックを回避
/{br 2、集合にカウントされるデータ(ただし、これはBig Keyの問題がある可能性があり、一般的に大量のデータには推奨されない)。

Redis ClusterではKeysコマンドはどのように動作するのですか?

一般に、keyコマンドはgetコマンドとは異なり、ルーティング先のクラスタノードが不明です。Java の Jedis クライアントの JedisClusterKeyCommands クラスでは

	public Set<byte[]> keys(byte[] pattern) {
		// Execute the keys command at each node
		Collection<Set<byte[]>> keysPerNode = connection.getClusterCommandExecutor()
				.executeCommandOnAllNodes((JedisClusterCommandCallback<Set<byte[]>> >) client -> client.keys(pattern))
				.resultsAsList();
		// merge into a whole and return
		Set<byte[]> keys = new HashSet<>();
		for (Set<byte[]> keySet : keysPerNode) {
			keys.addAll(keySet);
		}
		return keys;
	}


Jedisは、各ノードでkeysコマンドを実行し、その結果をマージして返していることがわかります。

この記事で、keysコマンドは遅いと書かれているので、彼はどれくらい遅いのでしょうか?

Keysコマンドはどれくらい遅いのか?

これは主に基本的な考え方をお伝えするためのもので、深く掘り下げて解説するものではありません。


これはTencent CloudのRedisクラスタサービスで遅いクエリを実行したときのログです。Keysコマンドがおおよそ次のように実行されていることがわかります。

250ms ~ 300ms.

ノードの情報から、各ノードには about 153w of keys メモリを占有する 300M+ キーとバリューのペアあたりの平均的なメモリフットプリントは 0.208KB 213 bytes .

私の理解では、keysコマンドはキーの値を返すので、実際にクラスタ内に構造体が存在する場合 slots_to_keys は、すべてのキーを記録していますが、これはキーの数だけに関係し、ビッグキーには関係しません。

この推測によると、この時点でRedisノードが3Gのメモリを占有しており、鍵の数が比例するとすると、Keysコマンドの実行に約3秒かかり、この間Redisノードはブロックしていることになります。

Redisのkeysコマンドは本当に遅いのか、この記事が全てです。Redisのkeysコマンドの詳細については、BinaryDevelopの過去記事を検索するか、以下の記事を引き続き閲覧してください。