系統上線時,提前將相關的緩存數據直接加載到緩存系統。避免在用戶請求的時候,先查詢數據庫,然后再將數據緩存的問題。
這里我考慮2個問題:
A、哪些數據需要預熱?
B、如何預熱?
關於問題A,根據不同的業務系統有不同的方法。
- 可以將已知的熱門數據加載到Redis,這種方法適合於基本不變化的數據;
- 使用redis-faina(https://github.com/facebookarchive/redis-faina.git)實時監控Redis熱key,但是因為redis-faina是通過調用Redis的monitor命令來實現的,可能降低Redis50%左右的性能,所以需要根據實際情況評估;
- 在proxy層,對每個請求進行收集上報,弊端就是需要修改proxy的代碼,需要考慮開發成本和穩定性問題;
- Redis-cli --hotkyes 查詢熱點key,只適用於緩存淘汰策略是lfu的時候(https://yq.aliyun.com/articles/278922);
- TCP消息抓包,例如ELK體系下的packetbeat插件(https://www.elastic.co/guide/en/beats/packetbeat/current/index.html),可以實現對Redis、MySQL等眾多主流服務的數據包抓取、分析、報表展示;
- 客戶端上報,例如nginx+lua將訪問量上報到kafka中,然后進行統計
關於如何預熱:
找出了熱點key之后,再根據自己的業務邏輯,到DB中查詢數據填充到Redis中去。不過既然考慮預熱,那么訪問量、數據量都會很大,因此要考慮並行(提高預熱速度)+ 限速(並發量太大的話,DB也處理不過來)。
參考鏈接: