這篇博客是筆者學習慕課網若魚老師的《Java秒殺系統方案優化 高性能高併發實戰》課程的學習筆記。若魚老師授課循循善誘,講解由淺入深,歡迎你們支持。html
本文記錄課程中的注意點,方便之後code review。此外,本文將注意點相關的優質講解連接在了一塊兒,方便初學者系統學習。前端
本文並不是單純介紹秒殺系統特有的技術點,不適合高手。進階學習的話,極客時間有個不錯的小專欄——如何設計一個秒殺系統,阿里高級技術專家講解秒殺系統的設計要點,那個課程挺乾貨的。java
用戶的數據庫表設計,須要增長一字段保存密碼的Salt值mysql
兩次MD5操做(敏感數據必定要使用https協議傳輸
):nginx
不用鹽的話,MD5字符串有可能會被彩虹表或者社工庫破解程序員
此次加鹽MD5,能夠有效防止內部員工泄露或者數據庫被拖庫後,明文密碼泄露算法
能夠參照javax.validation.constraints.NotNull註解,自定義本身的校驗器,將校驗代碼與業務代碼分離。不過因爲校驗失敗會輸出BindException異常,因此最好配合全局捕獲異常進行友好的輸出。sql
自定義校驗器很簡單,只須要定義一個註解和對應的校驗類數據庫
使用@ControllerAdvice註解,定義全局的異常捕獲,並從異常中獲取異常信息解析出來,發送給前端
能夠自定義一個GlobalException異常,利用全局異常捕獲,將全部服務器處理異常集中處理。(Service層處理異常後不設置狀態碼,而是直接拋GlobalException全局異常)後端
不返回狀態碼的好處是Controller層不須要再繁瑣的判斷Service層的返回值,代碼更簡潔
另外,自增ID的缺點也就是沒法在多個表中,或者多個數據庫中保持ID主鍵惟一不重複,因此如果使用分佈式數據庫以及數據合併的狀況下時不能使用自增ID的。
Service的api相比dao會多一些防護代碼(例如,直接修改了別的模塊dao數據,但緩存未清理),更加安全
秒殺有兩個事務:
PROPAGATION_REQUIRED是Spring默認的傳播機制,若是外層有事務,則當前事務加入到外層事務,一塊提交,一塊回滾。本工程的場景使用默認事務傳播機制便可
有關Spring事務傳播機制能夠查看這篇博客
接口測試能夠還使用Postman和ApacheBench
緩存方法:將渲染好的html文件存放到Redis。在訪問Url時,首先檢測Redis是否有html緩存。有緩存的話則直接返回緩存;沒有緩存的話則渲染後存入Redis,並返回給前端。頁面緩存過時時間具體根據業務場景判斷。
頁面局部緩存。熱點數據緩存,當Ajax請求信息更新,涉及的多是須要保存在數據庫的操做,例如表格信息等時,能夠採用Redis緩存,方法同頁面緩存同樣,定義好能夠區分業務的Key便可
若是須要採用JS/CSS壓縮或者減小鏈接數等方法,能夠使用HTTP2來提高性能
順序:
優化:
使用計數法,在攔截器作限制請求頻率。利用Redis緩存的有效期(以用戶ID拼接Url做爲key,以訪問次數爲value),指定緩存有效期爲1秒,訪問接口每次將value+1,到達閾值跳轉全局異常。
優化:使用攔截器+自定義註解,減小對業務代碼的侵入。有關攔截器能夠查看這篇博客
另外對於接口限流也能夠考慮使用令牌桶,控制對mysql的訪問。
最後,限於筆者經驗水平有限,歡迎讀者就文中的觀點提出寶貴的建議和意見。若是想得到更多的學習資源或者想和更多的技術愛好者一塊兒交流,能夠關注個人公衆號『全菜工程師小輝』後臺回覆關鍵詞領取學習資料、進入先後端技術交流羣和程序員副業羣。同時也能夠加入程序員副業羣Q羣:735764906 一塊兒交流。