天天看點

【高并發簡單解決方案】redis隊列緩存 + mysql 批量入庫 + php離線整合

需求背景:有個<code>調用統計日志存儲和統計需求</code>,要求存儲到mysql中;存儲資料高峰能達到日均千萬,瓶頸在于<code>直接入庫并發太高,可能會把mysql幹垮</code>。

思考:應用網站架構的衍化過程中,應用最新的架構和工具技術固然是最優選擇;但是,如果能在<code>現有的架構的基礎上提出簡單可依賴的解決方案</code>,未嘗不是一種提升自我的嘗試。

解決:

問題二:批量入庫就需要有高并發的消息隊列,決定采用redis list 仿真實作,而且友善復原。

問題三:日志量畢竟大,儲存最近30條足矣,決定用php寫個離線統計和清理腳本。

done,下面是小拽的簡單實作過程

考慮到log系統對資料庫的性能更多一些,穩定性和安全性沒有那麼高,<code>存儲引擎自然是隻支援select insert 沒有索引的archive</code>。如果确實有update需求,也可以采用myisam。

考慮到log是實時記錄的所有資料,數量可能巨大,<code>主鍵采用bigint,自增即可</code>。

考慮到log系統<code>以寫為主,統計采用離線計算,字段均不要出現索引</code>,因為一方面可能會影響插入資料效率,另外讀時候會造成死鎖,影響寫資料。

由于高并發,盡可能簡單,直接,上代碼。

定時讀取redis消息隊列裡面的資料,批量入庫。

主要是部署,批量入庫腳本的調用和天級統計腳本,crontab例行運作。

總結:相對于其他複雜的方式處理高并發,這個解決方案簡單有效:通過redis緩存抗壓,mysql批量入庫解決資料庫瓶頸,離線計算解決統計資料,通過定期清理保證庫的大小。