Redis 千萬不要亂用KEYS命令,不然會挨打的

2021-10-02 04:21:31 字數 2421 閱讀 8055

redis現如今使用的場景越來越多?如何批量刪除key呢?

有人說用keys命令,剛開始學redis的時候就是用這個命令列出庫中鍵。

keys命令要謹慎使用。

為何?客觀別急,我們先一步步來看。

上面是官方文件宣告,keys命令不能用在生產的環境中,這個時候如果數量過大效率是十分低的。同時也不要用keys正則匹配,官方建議直接用集合型別。

有人說keys相當於關係性資料的庫的select *,在生產環境幾乎是要禁用的。

試想如果redis阻塞超過10秒,如果有集群的場景,可能導致集群判斷redis已經故障,從而進行故障切換;

以上的情況嚴重會導致應用程式出現雪崩的情況。

然而,網上很多都是這麼寫的redis-cli --raw keys "key字首*" | xargs redis-cli del,千萬別照炒,拿到生產環境上做實驗。

順便普及下xargs命令,這是linux下的乙個命令 。

xargs命令是給其他命令傳遞引數的乙個過濾器,也是組合多個命令的乙個工具。它擅長將標準輸入資料轉換成命令列引數,xargs能夠處理管道或者stdin並將其轉換成特定命令的命令引數。xargs也可以將單行或多行文字輸入轉換為其他格式,例如多行變單行,單行變多行。xargs的預設命令是echo,空格是預設定界符。這意味著通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代。xargs是構建單行命令的重要元件之一。

redis從2.8版本開始支援scan命令,scan命令的基本用法如下:

scan cursor [match pattern] [count count]
127.0.0.1:6379> scan 0 match tony* 

1) "42"

2) 1) "tony25"

2) "tony2519"

3) "tony2529"

4) "tony2510"

5) "tony2523"

6) "tony255"

7) "tony2514"

8) "tony256"

9) "tony2511"

10) "tony15"

127.0.0.1:6379> scan 42 match tony* count 1000

1) "0"

2) 1) "tony3513"

2) "tony359"

3) "tony4521"

4) "tony356"

5) "tony30"

6) "tony320"

7) "tony3"

8) "tony312"

返回分為兩個部分如上面的**中, 1)代表下一次迭代的游標,2)代表本次迭代的結果集

,注意如果返回游標為0就代表全部匹配完成。

批量刪除scan命令

因為keys命令的時間複雜度為o(n),而scan命令會將遍歷操作分解成m次,然後每次去執行,從而時間複雜度為o(1)。也解決使用keys命令遍歷大量資料而導致redis伺服器阻塞的情況。所以建議使用下邊的指令進行批量的刪除操作:

redis-cli --scan --pattern "key字首*" | xargs -l 1000 redis-cli del總結

因為redis是但執行緒的keys在某種情況下會阻塞。有個真實真案件小哥哥生產用keys,最終導致服務宕機。後果很嚴重,產生的經濟損失就不說了。

切記嚴重會導致程式的雪崩,刪除的時候用scan命令,看完這篇文章應該都記住了。

redis開發的建議

1、 資料分離

不要什麼都往redis中放,盡量放些qps比較高的資料,記憶體的開銷很昂貴的,可以考慮硬碟存放。

2、分業務

不同的例項單獨放這樣訪問的時候方便些,故障的時候也不會影響其他的例項。

3、壓縮

redis中有很大的單個key的值建議壓縮成二進位制存放。

4、失效時間

redis中設定key的失效時間,如果不設定會一直占用著記憶體,而且key的失效時間應該根據業務場景來設定。

5、容量

占用記憶體不要太大10-20g,其次鍵的數量控制在1千萬以內。

6、監控

運維合理的監控好資料,做好redis安全漏洞的防護和災備。

Redis 千萬不要亂用KEYS命令,不然會挨打的

redis現如今使用的場景越來越多?如何批量刪除key呢?有人說用keys命令,剛開始學redis的時候就是用這個命令列出庫中鍵。keys命令要謹慎使用。為何?客觀別急,我們先一步步來看。上面是官方文件宣告,keys命令不能用在生產的環境中,這個時候如果數量過大效率是十分低的。同時也不要用keys正...

MyBatis 中 和 千萬不要亂用

這是一次 優化過程中發現的問題,在功能優化後發現部分資料查不到出來了,問題就在於一條sql上的 和 下圖為兩條sql 從圖上可以看出 wwlr.labelid in you can t use macro parameter character in math mode 和 wwlr.labelid...

不要亂用maxdos

不要亂用maxdos 昨天夜裡,老婆說家裡用於網銀支付的手提電腦十分慢,幾乎不能使用。我看了一下,確實是這樣子。這機子是2004年買的,pentium m 1.5g,後來記憶體到1.2gb,跟乙個winxp,想來不應該這麼慢,所以我決定重灌系統。我想這是臺老機器,可能是記憶體有問題,於是拆記憶體,刷...