關於高併發,線程,鎖的學習筆記

1.紙上得來終覺淺,絕知此事要躬行
經歷項目親自去做,比看100遍課程有用的多。
2.參考課程
https://www.bilibili.com/video/av52467230/?p=1
3.一些收穫
秒殺系統
應用:1.商品的搶購,2.羣紅包,3.優惠卷領取,4.搶火車票,5.電影票在線預約

特點:短時間的高併發,負載壓力大,讀多寫少,競爭資源有限,不能多買,不能少買,不能重複買

模擬多線程高併發時使用CountDownLatch來使創建的多個線程同時調用同一個方法,CyclicBarrier來進行計時處理。

樂觀鎖:
認爲數據一般情況下不會造成衝突,所以在數據進行提交更新的時候,纔會正式對數據的衝突與否進行檢測,如果發生了衝突,則返回用戶錯誤的信息,讓用戶決定如何去做或者程序自動去試。
讀多寫少,提高系統吞吐量
普遍應用的是:數據庫,緩存樂觀鎖

只是對數據庫進行操作的時候,對數據進行加鎖。

基於數據庫來實現,1.基於sql的版本,操作時進行版本的比對來實現(檢查版本是否一致,數據更新,版本號加一)。
2.基於數據的狀態,例如庫存減掉數量的時候大於0
(前兩點併發能力很低,數據庫的併發能力只有300~700)
3.使用緩存,cas機制,使用mencached來實現鎖的機制(1.引入包,2.配置3.gets和cas操作)

悲觀鎖:
對數據被外界修改持保守態度,因此在整個數據處理過程中將數據處於鎖定狀態,往往依靠數據庫提供的鎖機制實現
寫多讀少,保證數據安全

@transaction事物註解,不設置隔離級別就會使用數據庫的隔離級別,也就是數據庫會對數據進行加鎖,從某方法調用該數據開始,到該方法事務提交,也就是該方法的徹底結束爲止,該數據都是處於鎖定狀態,其他程序是無法調用的。是不允許該數據被其他程序進行修改操作的。

解決多併發最簡單的方法:調用的方法前加synchronized(同步控制,變成單併發),缺點是太慢了,不適合大的數據量
當有很多線程進入程序的時候,可以對他們進行隨機的休眠。

分層的原因:
1.儘量將壓力攔截在上層,(系統的瓶頸往往在數據庫層);
2.每一層都有緩存的技術,可以分擔壓力;
3.頁面段利用驗證碼等技術,進行限流,控制端用neginx對於大項目最主要的就是緩存,https,安裝插件(例如限流技術,跟據USERID限頻率),服務層利用微服務技術mencached和redies技術,如果處理壓力還是很大,削峯填谷,可以進行延時處理,請求隊列,分批發放(MQ技術)。數據庫層:(讀寫分離,分庫分表,數據庫集羣)
4.sql優化,執行計劃-》然後進行優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章