1 つのコマンドで数百万ドルの損失が発生しました。これには補償が必要ですか?
コードは標準化されていないので、同僚は泣き出しました。コーディングするときは注意してください。
興味があるので、テストしてみます。何が問題ですか?
1,000 万データを書き込みます。
for((i=1;i<=10000000;i++)); do echo "set k$i 哪吒编程$i" >> /tmp/test1.txt;done;
/tmp/test1.txt
で書き込みが成功したか確認してください。
cat /tmp/test1.txt | redis-cli -a 111111 --pipe
redis.conf ファイルでセキュリティを構成します:
rename- command keys "" rename- command flushdb "" rename- command flushall ""
Redis Scan コマンドは、データベース内のデータベース キーを反復処理するために使用されます。
SCAN コマンドはカーソルベースのイテレータです。呼び出されるたびに、新しいカーソルがユーザーに返されます。ユーザーは、この新しいカーソルを SCAN コマンドのカーソル パラメータとして使用する必要があります。次の反復: このようにして、前の反復プロセスが継続されます。
SCAN は 2 つの要素を含む配列を返します。最初の要素は次の反復の新しいカーソルであり、2 番目の要素は反復されたすべての項目を含む配列です。新しいカーソルが 0 を返した場合、反復が終了したことを示します。
scan 構文:
SCAN cursor [MATCH pattern] [COUNT count]
Alibaba Cloud Redis の開発仕様では、「ビッグキーの拒否 (ネットワーク カード トラフィックと低速クエリの防止)」
を明確に規定しています。
String 型は 10KB 以内に制御され、hash、list、set、zset 要素の数は 5000 を超えてはなりません。
文字列型はdelで削除されます。
他のタイプでは、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); }
を検索します。
(2) 各キー値のバイト数を計算し、メモリ使用量キーを検索します。
以上がRedis bigkeys コマンドがブロックする問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。