php 高並發下數據同步的問題



1.加鎖
缺點:降低性能
優點:減少代碼邏輯復雜度(題主現在這樣超過1w條就刪數據的邏輯,感覺看起來就點糟糕啊,如果整個系統一復雜,這樣的來回寫數據,你確定你的邏輯還維護得下去?建議題主梳理一下代碼的邏輯流)


2.隊列(redis/各類mq等)
缺點:引入其他組件,增加系統復雜度,降低穩定性。
優點:能夠將web的並行邏輯串行,其實和加鎖差不多,不過更優雅,並且性能上面也更可控。如果題主的系統的邏輯復雜,推薦采用這種。

建議:php寫多你會發現,它的邏輯就是一波流的。在它的邏輯層實現過多的重試,等待,以及回寫,會導致php很臃腫。建議要么在數據庫層上鎖,要么引入隊列等待,要么就直接報錯,讓用戶F5重試,如果用ajax重試,幾乎沒有用戶體驗上的問題。那么來說一下直接報錯的方案。

3.建一個計數器表
舉例:
create table store_count (total int(11) NOT NULL) ENGINE=InnoDB
搶計數器:
如果我查出來現在總數是2,那么我 update store_count set total = 3 where total = 2
如果更新成功,說明現在的總行數是3,可以去插表,如果未更新,說明這時已經有其他用戶插入了,直接給用戶報錯,讓他下次請求再來過。

缺點:這種方式其實比前兩個更粗暴,前2種方式還是等待的,這種方式直接丟棄了部分用戶流量,帶來的是一個有緩存特性的計數器來實現題主提的邏輯。
這個計數器在內存中效果更佳。

建議題主根據自身的系統狀況,和代碼邏輯,進行性能、開發效率、邏輯成本、維護成本上的取舍。
 
 
===================================================================================
 
用一個計數器
我最近在做一個項目 高並發選課系統
每次insert之前先計數器+1然后判斷他的值是否大於max
如果大於max計數器自減1 類似回滾
如果小於max 執行insert語句

ps:計數器自增和自減需要保證其原子性
推薦Redis來做計數器 max也可以用redis來存.
 
====================================================================================
用隊列
====================================================================================
加鎖就行,要么鎖表,要么鎖程序,加了鎖就相當於變成隊列執行,一次只能一個人拿到鎖,只能一個人通過,去插入數據。
php里可以使用文件鎖,或memcached鎖也行,文件鎖會導致阻塞。
可以搜索:php鎖,php文件鎖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM