Redis可能會(huì)阻塞的情況

1. 大key

如果一個(gè)值的size過(guò)大,寫入時(shí)開辟內(nèi)存以及發(fā)送時(shí)的數(shù)據(jù) copy 開銷都會(huì)很大。
建議從業(yè)務(wù)上對(duì)大key做拆分。

2. 復(fù)雜命令

對(duì)于一些數(shù)據(jù)結(jié)構(gòu)的操作,時(shí)間復(fù)雜度為 O(N) ,如果不加控制,可能會(huì)引起阻塞。
例如 Keys 命令,由于沒有l(wèi)imit參數(shù),會(huì)全表掃描,耗時(shí)大。可以考慮用Scan替代。

3. 高并發(fā)下的網(wǎng)絡(luò)IO

盡管使用了IO多路復(fù)用技術(shù),讀寫 copy 以及 User Mode 和 Kernel Mode 的切換會(huì)比較耗時(shí)。

4. RDB模式下的fork開銷

盡管 RDB 是fork后獨(dú)立進(jìn)程中完成落盤工作,fork 這個(gè) System Call 本身耗時(shí)大概在700ms級(jí)別。
建議盡量避免在高峰時(shí)期執(zhí)行 Save 或 Bgsave 命令。

5. AOF模式下的 Fsync 開銷

由于AOF需要修改磁盤中的日志文件,修改文件及其iNode需要兩次隨機(jī)讀寫IO,大約耗時(shí)在20ms級(jí)別,因此業(yè)務(wù)中幾乎不會(huì)開啟 always 模式。
一般都用 Everysecond模式。

6. 大量同時(shí)expire的key

由于 Redis 的刪除過(guò)期鍵策略中有一條是主動(dòng)刪除:會(huì)隨機(jī)抽出100個(gè)設(shè)置了過(guò)期的key,對(duì)已過(guò)期的進(jìn)行刪除,如果發(fā)現(xiàn)過(guò)期的key超過(guò)25個(gè),就會(huì)重復(fù)這個(gè)過(guò)程。因此,如果有大量同一時(shí)間過(guò)期的key,會(huì)在主動(dòng)刪除觸發(fā)時(shí),不停地取key刪key,造成阻塞。
建議在設(shè)置過(guò)期時(shí)間時(shí)使用 Expire 而非 Expireat,或者使用 Expireat 時(shí)自己給入一個(gè)隨機(jī)量,讓過(guò)期時(shí)間離散開。

7. 內(nèi)存逐出

當(dāng) Redis 可支配的內(nèi)存空間不足時(shí),會(huì)進(jìn)行內(nèi)存逐出操作。盡管可以配置策略,但是逐出時(shí)CPU會(huì)hang住。
建議對(duì)內(nèi)存使用情況做監(jiān)控,及時(shí)擴(kuò)容或進(jìn)行其他人為介入操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容