對于redis服務,通常我們推薦使用者使用長連接配接來通路redis,由于短連接配接每次需要建立連結是以短連接配接在tcp協定層面性能就比長連接配接低效,但是由于某些使用者在連接配接池失效的時候還是會建立大量的短連接配接或者使用者由于用戶端限制還是隻能使用短連接配接來通路redis,而原生的redis在頻繁建立短連接配接的時候有一定性能缺陷,我們在雲上就碰到使用者短連接配接的性能問題。
通過曆史監控我們可以發現使用者在頻繁使用短連接配接的時候redis的cpu使用率有顯著的上升
通過扁鵲檢視但是redis的cpu運作情況如下
從扁鵲我們可以看到redis在freeclient的時候會頻繁調用listsearchkey,并且該函數占用了百分30左右的調用量,如果我們可以優化降低該調用,短連接配接性能将得到具體提升。
通過以上分析我們可以知道redis在釋放連結的時候頻繁調用了listsearchkey,通過檢視redis關閉用戶端源碼如下
從源碼我們可以看到redis在釋放連結的時候周遊server.clients查找到對應的redisclient對象然後調用listdelnode把該redisclient對象從server.clients删除,代碼如下:
檢視server.clients為list結構,而redis定義的list為雙端連結清單,我們可以在createclient的時候将redisclient的指針位址保留再freeclient的時候直接删除對應的listnode即可,無需再次周遊server.clients,代碼優化如下:
freeclient修改如下:
在同一台實體機上啟動優化前後的redis,分别進行壓測,壓測指令如下
其中-k 代表使用短連接配接進行測試
原生redis-server結果:
優化後redis-server結果
我們可以看到優化之後的redis-server性能在短連接配接多的場景下提升了百分30%以上。