首頁 > 資料庫 > Redis > Redis bigkeys指令會阻塞問題如何解決

Redis bigkeys指令會阻塞問題如何解決

WBOY
發布: 2023-05-28 13:22:06
轉載
1632 人瀏覽過

一、順豐高級開發工程師在線執行了 Redis 危險命令導致某公司損失 400 萬

Redis bigkeys指令會阻塞問題如何解決

一個命令損失數百萬,這,需要賠償嗎?

程式碼不規範,同事兩行淚,擼碼需謹慎!

處於好奇考慮,我來測試一下,這到底是什麼問題?

二、測試一下1000萬資料的效能

1、寫腳本檔案

寫入1000萬資料。

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

透過/tmp/test1.txt查看一下是否寫入成功。

Redis bigkeys指令會阻塞問題如何解決

2、寫入Redis1000萬資料

cat /tmp/test1.txt | redis-cli -a 111111 --pipe
登入後複製

Redis bigkeys指令會阻塞問題如何解決

3、透過keys * 查看1000萬資料

Redis bigkeys指令會阻塞問題如何解決

4、透過設定檔禁止keys *的使用

在redis.conf檔中設定security:

  rename- command keys ""
  rename- command flushdb ""
  rename- command flushall ""
登入後複製

三、使用scan取代keys *

Redis Scan 指令用於迭代資料庫中的資料庫鍵。

SCAN 指令是一個基於遊標的迭代器,每次被呼叫之後, 都會向使用者傳回一個新的遊標, 使用者在下次迭代時需要使用這個新遊標作為SCAN 指令的遊標參數, 以此來延續之前的迭代過程。

SCAN 傳回一個包含兩個元素的數組, 第一個元素是用來進行下一個迭代的新遊標, 而第二個元素則是一個數組, 這個數組包含了所有被迭代的元素。如果新遊標傳回 0 表示迭代已結束。

scan語法:

SCAN cursor [MATCH pattern] [COUNT count]
登入後複製

Redis bigkeys指令會阻塞問題如何解決

四、拒絕bigkey

1、阿里雲Redis開發規格

阿里雲Redis開發規範中明確規定「拒絕bigkey(防止網路卡流量、慢查詢)」

String類型控制在10KB以內,hash、list、set、zset元素個數不要超過5000。

2、bigkey出現時如何刪除?

  1. String類型的用del刪除。

  2. 其它型別使用hscan、sscan、zscan方式漸進式刪除,同時要避免bigkey過期時間自動刪除問題,因為它會造成主執行緒阻塞。

Hash 刪除: 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、如何發現bigkey?

(1)透過redis-cli --bigkeys找到。

Redis bigkeys指令會阻塞問題如何解決

(2)計算每個鍵值的位元組數,透過memory usage key找出

Redis bigkeys指令會阻塞問題如何解決

#

以上是Redis bigkeys指令會阻塞問題如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板