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)行其他人為介入操作。