php 高並發下資料同步的問題

來源:互聯網
上載者:User

標籤:


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 高並發下資料同步的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.