性能測試
同一門課程,會拆分為多個小班進行授課,每個小班會對於一個評分,課程負責人需要獲取所有小班的評分並進行排名。
假設100個課程,每個課程有100個小班,模擬100個並發請求課程所有小班評分數據,每個並發循環30000次。
使用阿里雲Redis進行壓測,實例規格為2G集群版(2節點)
方案1:將每個課程下每個小班的數據使用單獨hash鍵來存放,按照課程下每個小班循環獲取(HGETALL 1 KEY)
峰值QPS: 52.1K/s
峰值CPU: 34.0%
峰值流量: 1.1MB/s
執行耗時:30000*100*100/52100=5758秒
方案2:將每個課程下所有小班的數據使用一個hash鍵來存放,按照課程批量獲取所有小班數據(HGETALL 1 KEY)
峰值QPS: 14.7K/s
峰值CPU: 22.1%
峰值流量: 25MB/s
執行耗時:30000*100/14700=204秒
方案3:將每個小班的評分使用string方式存儲,按照課程下每個小班循環獲取(GET 1 KEY)
峰值QPS: 52.3k/s
峰值CPU: 33.1%
峰值流量: 2.55MB/s
執行耗時:30000*100*100/52300=5736秒
方案4:將每個小班的評分使用string方式存儲,按照課程下所有小班進行批量獲取(MGET 100 KEY)
峰值QPS: 34.5k/s
峰值CPU: 66.7%
峰值流量: 61.8MB/s
執行耗時:30000*100/34500=87秒
性能分析
- 使用HGETALL請求包含1個filed的鍵和請求包含100個filed的鍵的CPU消耗比約為1比2.3,但由於請求次數降低100倍,因此性能能提升約43倍。
- 使用MGET批量請求100個鍵和使用GET請求1個鍵的CPU消耗比約為3.1比1,但由於請求次數降低100倍,因此性能約提升約30倍。
PS: 如果針對排名問題,優先推薦使用SORTED SET來處理