[什么地方會產生高並發]
1.高並發導致性能問題的理論知識:
1.1.訪問Mysql產生的網絡延遲
1.2.Mysql本身的性能問題,可以扛4W的QPS
1.3.JVM GC的問題
2.場景一:秒殺接口URL的暴露請求 --> 用戶頻繁點擊秒殺按鈕產生
該業務中每次請求都會根據id查詢秒殺產品 --> 數據庫訪問 --> 后續logic(秒殺開啟暴露秒殺按鈕,秒殺未開啟顯示剩余開啟時間\秒殺結束)
該場景的特點:數據訪問對象相對變化小(秒殺產品信息不回頻繁變化),性能瓶頸主要來自Mysql
解決方案:使用Redis緩存,將秒殺產品存儲在Redis中,當Redis中存在時不訪問Mysql
技術點:[JRedis的使用,API] [ProtoBuff序列化,提高效率,節省空間] [數據一致性維護,通過Redis超時機制]
深入思考:[在實際場景中Redis集群維護數據一致性的解決方案] 參考 - http://blog.csdn.net/u014490157/article/details/52244378
3.Redis應用的編碼示例[TODO]
4.場景二:執行秒殺操作 --> 插入購買明細+減庫存
減庫存是對seckill表中seckill_id同行數據的並發請求,產生競爭條件
該操作在一個事務中,根據mysql事務的行級鎖機制產生阻塞
優化的目標就是減少單個事務對行級鎖持有的時間
對持有時間的影響因素:網絡延遲,大量並發訪問產生java對象引起的GC(GC原理,新生代老年代)
解決方案:
1.調整事務方法中sql執行的順序,將產生競爭條件的無關聯sql后置
2.將后台業務放到交給Mysql存儲過程,僅適用特定不核心的業務,因為:阿里技術手冊中約定 - 7. 【強制】禁止使用存儲過程,存儲過程難以調試和擴展,更沒有移植性。
3.企業級高並發解決方案(原子計數器+消息隊列+分布式),技術成本,維護數據一致性
5.Mysql存儲過程的編寫、使用Mybatis調用Mysql存儲過程[TODO]
[互聯網公司的常見系統架構和部署方式]
1.分庫分表技術:阿里TDDL,中間件
2.統計分析:Hadoop,ElasticSearch