亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

大家對PHP多進程與MySQL的高并發瓶頸是怎么處理的

大家對PHP多進程與MySQL的高并發瓶頸是怎么處理的

函數式編程 2019-04-08 11:16:42
需求我每天執行一個定時任務,把一個具有千萬條數據的日志分割成一些小的日志文件;然后啟動多個PHP進程,分別對這些小日志文件中的每行數據進行處理,處理過程是這樣的:每個PHP進程從各自負責的日志文件中逐行讀取,然后根據該行中的一個標識去數據庫中查找是否有了該記錄,如果沒有則插入該行,如果已經存在了就更新(該行的數據與數據庫中的數據進行合并);引發的問題這樣就出現了一個問題,就是可能存在多個PHP進程對同一條數據都在做處理,如果用Mysql鎖機制可以避免這個問題,但是這樣的話,就出現另一個問題,就是MySQL的高并發瓶頸,因為我是多個PHP進程同時在進行,一個進程要等待另一個進程解鎖后,才能操作數據庫。這樣我前面所做的分割日志、啟動多個進程這些操作就失去意義了,因為我在前面做日志分析時,啟的進程再多,運行的再快,到最后全都會卡在高并發操作數據庫這個瓶頸上,不知道大家對這類問題是怎么處理的?
查看完整描述

2 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

寫過類似的東西,像這種需要多次更新同一賬號數據的時候,我們的做法是處理完數據后不立即存入mysql,
而是放在了redis中,后面的數據更新都在redis修改,
在redis積累了數千條數據后在異步的寫一次數據到mysql,效果不錯
鹵煮的場景多進程處理建議只負責數據處理,處理完的放redis,在單獨用一個腳本定時檢測redis
達到條件的時候(一定條數或時間)存一次數據到mysql
                            
查看完整回答
反對 回復 2019-04-08
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

上面的兩種方法都可行
建主鍵索引,使用upsert語句是最便捷的解決方法。如上@felix021大神所言。
另外,使用緩存(Memcache或者redis)異步寫入數據也不錯,只是開發代價要高一些。
                            
查看完整回答
反對 回復 2019-04-08
  • 2 回答
  • 0 關注
  • 362 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號