前端請求php寫入資料的介面太頻繁,導致mysql中出現大量重複資料,如何處理
回複內容:
前端請求php寫入資料的介面太頻繁,導致mysql中出現大量重複資料,如何處理
這個問題從三個方面來回答題主:
前端
前端的話要對請求進行限制,通過disabled提交按鈕或者是設定定時器來禁止使用者多重提交。
介面
介面一定要做好limit,但是這個並不是解決這個問題的關鍵點,因為你不可能設定一個limit為1 time per min
。為什麼關注這個點是因為有時候使用者並不是一個人,可能是惡意程式。
後端服務
個人覺得這個是重點,它包括PHP端和Mysql。我不清楚你的資料是怎樣的,我舉例新浪微博。如果一個使用者寫好微博然後快速點擊了兩次發送,你會看到什嗎?兩條相同微博嗎?不可能,出現了你來找我好了。最簡單的做法,要對上次資料緩衝,然後校正是否是重複提交的。Mysql結構要設計好,如果你的資料要唯一,那麼你的欄位和主鍵設計時候要設定確保唯一性。
先碼這麼多,解決方案有好多種,可以去搜尋一下。
高並發還行吧,防止重複一般都是從資料上去處理的,前端也會做限制,因為重複資料肯定是重複請求,那麼頁面上防止重複點擊肯定是要做的,這肯定不是什麼特別有效方式,加上唯一的約束肯定是最好的方式,無論是請求時第三方的唯一約束,還是時間或者其他你們資料能稱作唯一的肯定是最好的。不過重複感覺很難避免,百度貼吧或者,qq有時候也會出現重複,尤其是伺服器效能降低卡頓的時候。
前端的請求是冗餘的嗎,是的話前端要做請求防重
最佳解決思路為:將並行轉換為串列。
轉換的方法有很多,常見的就是隊列形式。
首先你可以用UNIQUE INDEX給相應的field防止重複寫入
比如 ALTER TABLE thetable ADD UNIQUE INDEX(pageid, name);
其次,要你的選擇可以是:
// 選擇一:覆蓋之前同id的詞條INSERT INTO thetable (pageid, name, somefield)VALUES (1, "foo", "first")ON DUPLICATE KEY UPDATE (somefield = 'first')// 選擇二:添加重複計數器INSERT INTO thetable (pageid, name)VALUES (1, "foo"), (1, "foo")ON DUPLICATE KEY UPDATE (pagecount = pagecount + 1)
最後,可以在寫入之前先尋找,求count(*),不過這種效率比較低。
好像沒有有效方式完美解決這個問題,可以設定一個緩衝判斷,執行過寫入一次,就不再執行下次同一寫入
熟悉linux可參考sudo鎖;
緩衝吧 記憶體建key 插入關聯式資料庫 延遲銷毀 key
好奇怪你們難道都不知道mysql的共用鎖定嗎
加鎖啊,共用鎖定
一般來說都是前端限制下,比如button按鈕在後端響應結束之前置灰;一般需求這樣做就足夠了
七目魚
前端限制 -- 過濾頻繁的請求,如按鈕變灰,或者控制一個標誌變數來判斷是否執行ajax請求 。。這個只是體驗,並不能真的限制~~
關鍵是後端限制
比如: select for update
整個請求的過程都可以做放置重複提交的驗證。
在前端控制,比如按鈕置灰等
在後端商務邏輯中,通過查詢,判斷該內容是否已經提交過(通過緩衝來記錄之類的)
在資料庫層通過唯一鍵的方式來限制重複提交的記錄。對於重複提交的內容自動被過濾。
在高並發的情況下,其實還要考慮下db 是不是能夠扛得住並發,所以增加隊列的限制,使得並發在進入db 的時候是一個串列的操作,當然這個還得看時機情況了。
MYSQL 的話用交易處理吧。。。
樓上回答的,有沒有看問題啊。這種情況基本上只能靠前端做限制,或者API規定同一個唯一標識的請求頻率。
需要說明什麼資料重複了,重複了有什麼影響?商務邏輯上要做避免重複的檢查嗎?先把商務邏輯定義清楚,才能有針對性的出解決方案。
前端先過濾掉重複重新整理的。然後服務端再去過濾。
在表單裡產生一個唯一的標識,提交的時候判斷這個標識的內容有沒有提交過了。