標籤:
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檔案鎖
php 高並發下資料同步的問題