Redis作為內(nèi)存數(shù)據(jù)庫,擁有非常高的性能贺纲,單個實例的QPS能夠達到10W左右航闺。但我們在使用Redis時,經(jīng)常時不時會出現(xiàn)訪問延遲很大的情況猴誊,如果你不知道Redis的內(nèi)部實現(xiàn)原理潦刃,在排查問題時就會一頭霧水。
很多時候懈叹,Redis出現(xiàn)訪問延遲變大乖杠,都與我們的使用不當或運維不合理導(dǎo)致的。
這篇文章我們就來分析一下Redis在使用過程中澄成,經(jīng)常會遇到的延遲問題以及如何定位和分析胧洒。
使用復(fù)雜度高的命令
如果在使用Redis時,發(fā)現(xiàn)訪問延遲突然增大墨状,如何進行排查卫漫?
- 1、首先肾砂,第一步列赎,建議你去查看一下Redis的慢日志。Redis提供了慢日志命令的統(tǒng)計功能镐确,我們通過以下設(shè)置包吝,就可以查看有哪些命令在執(zhí)行時延遲比較大。
首先設(shè)置Redis的慢日志閾值辫塌,只有超過閾值的命令才會被記錄漏策,這里的單位是微妙,例如設(shè)置慢日志的閾值為5毫秒臼氨,同時設(shè)置只保留最近 1000 條慢日志記錄:
# 命令執(zhí)行超過5毫秒記錄慢日志
CONFIG SET slowlog-log-slower-than 5000
# 只保留最近1000條慢日志
CONFIG SET slowlog-max-len 1000
設(shè)置完成之后,所有執(zhí)行的命令如果延遲大于5毫秒芭届,都會被Redis記錄下來储矩,我們執(zhí)行SLOWLOG get 5查詢最近5條慢日志:
127.0.0.1:6379> SLOWLOG get 5
1) 1) (integer) 32693 # 慢日志ID
2) (integer) 1593763337 # 執(zhí)行時間
3) (integer) 5299 # 執(zhí)行耗時(微妙)
4) 1) "LRANGE" # 具體執(zhí)行的命令和參數(shù)
2) "user_list_2000"
3) "0"
4) "-1"
2) 1) (integer) 32692
2) (integer) 1593763337
3) (integer) 5044
4) 1) "GET"
2) "book_price_1000"
...
通過查看慢日志記錄,我們就可以知道在什么時間執(zhí)行哪些命令比較耗時褂乍,如果你的業(yè)務(wù)經(jīng)常使用O(n)以上復(fù)雜度的命令持隧,例如sort、sunion逃片、zunionstore屡拨,或者在執(zhí)行O(n)命令時操作的數(shù)據(jù)量比較大,這些情況下Redis處理數(shù)據(jù)時就會很耗時硫椰。
如果你的服務(wù)請求量并不大级野,但Redis實例的CPU使用率很高集畅,很有可能是使用了復(fù)雜度高的命令導(dǎo)致的免猾。
解決方案:就是宾袜,不使用這些復(fù)雜度較高的命令薄扁,并且一次不要獲取太多的數(shù)據(jù)孕豹,每次盡量操作少量的數(shù)據(jù)废封,讓Redis可以及時處理返回貌踏。