ホームページ  >  記事  >  データベース  >  Redis bigkeys コマンドがブロックする問題を解決する方法

Redis bigkeys コマンドがブロックする問題を解決する方法

WBOY
WBOY転載
2023-05-28 13:22:061562ブラウズ

1. SF Express の上級開発エンジニアがオンラインで危険な Redis コマンドを実行し、企業に 400 万ドルの損失をもたらしました。

Redis bigkeys コマンドがブロックする問題を解決する方法

1 つのコマンドで数百万ドルの損失が発生しました。これには補償が必要ですか?

コードは標準化されていないので、同僚は泣き出しました。コーディングするときは注意してください。

興味があるので、テストしてみます。何が問題ですか?

2. 1,000 万データのパフォーマンスをテストする

1. スクリプト ファイルを作成します

1,000 万データを書き込みます。

for((i=1;i<=10000000;i++)); do echo "set k$i 哪吒编程$i" >> /tmp/test1.txt;done;

/tmp/test1.txtで書き込みが成功したか確認してください。

Redis bigkeys コマンドがブロックする問題を解決する方法

2. 1,000 万のデータを Redis に書き込む

cat /tmp/test1.txt | redis-cli -a 111111 --pipe

Redis bigkeys コマンドがブロックする問題を解決する方法

3. キーを介して 1,000 万のデータを表示する *

Redis bigkeys コマンドがブロックする問題を解決する方法

4. 構成ファイルを通じてキーの使用を禁止します *

redis.conf ファイルでセキュリティを構成します:

  rename- command keys ""
  rename- command flushdb ""
  rename- command flushall ""

3. 次を使用します。キーの代わりにスキャン *

Redis Scan コマンドは、データベース内のデータベース キーを反復処理するために使用されます。

SCAN コマンドはカーソルベースのイテレータです。呼び出されるたびに、新しいカーソルがユーザーに返されます。ユーザーは、この新しいカーソルを SCAN コマンドのカーソル パラメータとして使用する必要があります。次の反復: このようにして、前の反復プロセスが継続されます。

SCAN は 2 つの要素を含む配列を返します。最初の要素は次の反復の新しいカーソルであり、2 番目の要素は反復されたすべての項目を含む配列です。新しいカーソルが 0 を返した場合、反復が終了したことを示します。

scan 構文:

SCAN cursor [MATCH pattern] [COUNT count]

Redis bigkeys コマンドがブロックする問題を解決する方法

4. bigkey を拒否

1. Alibaba Cloud Redis 開発仕様

Alibaba Cloud Redis の開発仕様では、「ビッグキーの拒否 (ネットワーク カード トラフィックと低速クエリの防止)」 を明確に規定しています。

String 型は 10KB 以内に制御され、hash、list、set、zset 要素の数は 5000 を超えてはなりません。

2. bigkey が表示された場合に削除するにはどうすればよいですか?

  1. 文字列型はdelで削除されます。

  2. 他のタイプでは、hscan、sscan、zscan メソッドを使用して段階的に削除しますが、同時に、bigkey の有効期限が自動的に削除される問題は回避する必要があります。ブロックするスレッド。

ハッシュ削除: hscan hdel

public void delBigHash(String host, int port, String password, String bigHashKey) {
    Jedis jedis = new Jedis(host, port);
    if (password != null && !"".equals(password)) {
        jedis.auth(password);
    }
    ScanParams scanParams = new ScanParams().count(100);
    String cursor = "0";
    do {
        ScanResult<Entry<String, String>> scanResult = jedis.hscan(bigHashKey, cursor, scanParams);
        List<Entry<String, String>> entryList = scanResult.getResult();
        if (entryList != null && !entryList.isEmpty()) {
            for (Entry<String, String> entry : entryList) {
                jedis.hdel(bigHashKey, entry.getKey());
            }
        }
        cursor = scanResult.getStringCursor();
    } while (!"0".equals(cursor));
    
    //删除 bigkey
    jedis.del(bigHashKey);
}

3. bigkey はどのような問題を引き起こしますか?

  1. #メモリが不均一で、クラスターの移行が困難;

  2. タイムアウトによる削除、スレッドのブロック;

  3. # # ネットワーク トラフィックがブロックされています;
  4. 4. bigkey を見つける方法は?

(1)

redis-cli --bigkeys

を検索します。

Redis bigkeys コマンドがブロックする問題を解決する方法(2) 各キー値のバイト数を計算し、メモリ使用量キーを検索します。

以上がRedis bigkeys コマンドがブロックする問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。