Redisのkeysコマンドの遅さ
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の過去記事を検索するか、以下の記事を引き続き閲覧してください。
関連
-
redisプラグインbloom-filterをcentosにインストールする方法
-
Redisにおけるビットマップの説明
-
redis クラスタの実装は同じプレフィックスを持つキーをクリーンアップします。
-
Redis 3つのクラスターモードの説明
-
redisを使ってnearly peopleの機能を実装する
-
Redisの高同期スパイクを防ぐために、ソースコードソリューションを売られすぎ
-
マイクロサービス領域におけるredisの貢献度を説明する
-
インストール後、Redis-cliが動作しない(redis-cli: コマンドが見つからない)。
-
RedisTemplateでRedisを操作する、この記事で十分です(a)
-
redis アプリケーション編 ---- スパイク、サインイン、セッション共有
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JAVAでRedisの5つのデータ構造を利用する方法
-
redis の RedissonLock が待ちロックを実装する方法
-
redisでluaスクリプトを使用するためのチュートリアル
-
SpringBootプロジェクトにおけるRedis。包括的なアプリケーション
-
Redisによる分散シングルナンバーと分散ID(カスタムルール生成)
-
Redisによる携帯電話認証コード配信の模倣例
-
シングルスレッドのredisがなぜ速いのかの紹介
-
Redisの文字列はどのように実装されているか
-
Redisの分散ロックについて簡単に説明します
-
RedisClusterが16,384個のスロットを持つ設計になっている理由