中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2023-03-29 17:28:18 來源:億速云 閱讀:174 作者:iii 欄目:開發技術

這篇文章主要介紹“Redis bigkeys命令會阻塞問題如何解決”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Redis bigkeys命令會阻塞問題如何解決”文章能幫助大家解決問題。

一、 順豐高級開發工程師在線執行了 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命令會阻塞問題如何解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广灵县| 会理县| 思茅市| 琼结县| 惠来县| 锡林郭勒盟| 蚌埠市| 乌兰察布市| 乳源| 沙坪坝区| 盘山县| 太白县| 固阳县| 文山县| 洪泽县| 石屏县| 乌鲁木齐县| 紫金县| 玉门市| 固阳县| 克什克腾旗| 越西县| 堆龙德庆县| 综艺| 惠安县| 宜丰县| 襄城县| 辉县市| 苍梧县| 噶尔县| 古蔺县| 西昌市| 仙居县| 玉树县| 建始县| 灌南县| 邢台县| 内江市| 肃宁县| 万盛区| 青河县|