-
Mybatis 中寫 store producer
查看全部 -
投影片~~~~~~
建立 store procedure-- 秒杀存储过程 DELIMITER $$ -- 定义存储过程 -- 参数: -- in 输入参数;out 输出参数 -- row_count 用来返回上一条修改类型的 SQL(delete、insert、update)的影响行数 -- row_count 0:表示未修改数据;>0:表示修改的行数;<0:SQL 错误/未执行修改 CREATE PROCEDURE `seckill`.`execute_seckill` (IN v_seckill_id BIGINT, IN v_phone BIGINT, IN v_kill_time TIMESTAMP, OUT r_result INT) BEGIN DECLARE insert_count INT DEFAULT 0; START TRANSACTION; INSERT IGNORE INTO success_killed (seckill_id, user_phone, create_time) VALUES (v_seckill_id, v_phone, v_kill_time); SELECT ROW_COUNT() INTO insert_count; IF (insert_count = 0) THEN ROLLBACK; SET r_result = -1; ELSEIF (insert_count < 0) THEN ROLLBACK; SET r_result = -2; ELSE UPDATE seckill SET number = number - 1 WHERE seckill_id = v_seckill_id AND end_time > v_kill_time AND start_time < v_kill_time AND number > 0; SELECT ROW_COUNT() INTO insert_count; IF (insert_count = 0) THEN ROLLBACK; SET r_result = 0; ELSEIF (insert_count < 0) THEN ROLLBACK; SET r_result = -2; ELSE COMMIT; SET r_result = 1; END IF; END IF; END; $$ -- 存储过程定义结束 DELIMITER ; SET @r_result = -3; -- 执行存储过程 CALL execute_seckill(1006, 15926828238, NOW(), @r_result); -- 获取结果 SELECT @r_result; -- 存储过程 -- 1、存储过程优化:事务行级锁持有的时间 -- 2、不要过度依赖存储过程 -- 3、简单的逻辑,可以应用存储过程 -- 4、QPS:一个秒杀单 6000/qps
mysql -u root -Dseckill 把上面的語法貼,然後測試看看
show create procedure execute_seckill\G // 可以看建立的 store procedure
查看全部 -
投影片~~~~~~
ChatGPT:更新庫存是一個熱點操作,容易產生行級鎖,而插入購買記錄的行為則不會產生行級鎖。為了避免重複秒殺帶來的不必要的庫存更新操作和減少行級鎖的佔用,可以先插入購買明細,然後再進行庫存的更新。
在程式碼中,根據熱點商品競爭的結果,可以根據判斷來決定下一步是回滾(rollback)還是提交(commit)事務。這樣做的好處是可以降低網絡延遲和垃圾回收(GC)對系統的影響,節省了一部分時間。
將插入操作放在前面的原因是,插入操作組成了一個元件,包含秒殺單的資訊、使用者ID和電話等,這個元件的衝突機率並不高。因此,可以平行執行插入操作,網絡延遲和GC的影響可以並行進行。之後再執行更新庫存的操作,這時候需要處理行級鎖(rowLock)。
行級鎖(rowLock)是最小粒度的鎖,並行度最高,但加鎖的過程比較慢。
總的來說,以上策略的最終目的是為了降低MySQL行級鎖的持有時間,以提高系統的並行度和效率。需要根據具體情況和需求來選擇最佳的策略,並進行性能測試和優化。
查看全部 -
Protostuff是一個高效的Java序列化框架,它使用基於協定緩衝區(Protocol Buffers)的二進制編碼格式,可以將對象序列化為緊湊且高效的字節數據。相比於JVM默認的Java序列化方式,Protostuff在效率上具有一些優勢。查看全部 -
投影片~~~~~~
方法一:成本高,大公司使用
=================================
===============================
方法二:放到服务器端完成,MySQL执行sql效率非常高
===========================
查看全部 -
投影片~~~~~
為什麼要單獨獲取系統時間?
ChatGPT:在秒殺操作的最佳化分析中,你提到了CDN的限制以及資料一致性和庫存減少的競爭問題。這些觀點是正確的,以下是對這些問題的一些進一步解釋和建議:
1. CDN限制:CDN主要用於快取靜態資源,無法有效地快取動態和個別的秒殺地址。對於變化頻繁的秒殺地址,CDN的快取效果不佳。因此,在秒殺操作中,我們無法依賴CDN來提高性能或減輕服務器負載。
2. 寫操作和核心資料的問題:秒殺操作通常涉及到大量的寫操作,例如庫存減少和購買記錄的更新。這些操作需要直接與核心資料庫交互,而CDN無法幫助我們處理這些寫操作。在這種情況下,我們需要依賴更強大的資料庫和事務管理來確保資料的一致性。
3. 資料一致性和庫存減少的競爭:在高並發的秒殺場景中,多個使用者同時競爭庫存資源,可能會導致庫存的不一致性和競爭條件。這是一個很難處理的問題,需要仔細考慮並使用相應的解決方案。
在解決這些問題時,以下是一些建議:
1. 使用事務管理:使用MySQL的事務來確保庫存減少和購買記錄的更新操作的一致性。通過將相關的操作放入一個事務中,可以確保這些操作的原子性和一致性。
2. 優化資料庫性能:優化資料庫的性能是關鍵。使用適當的索引、分區、緩存等技術來提高資料庫的查詢和寫入性能,以應對高並發的秒殺場景。
3. 使用緩存:在合適的場景下,可以使用緩存來減輕資料庫的負載,例如將熱門商品的庫存信息存儲在緩存中,以減少對資料庫的頻繁查詢。
4. 拆分和分流:如果處理大量並發
請求的單一服務器成為瓶頸,可以考慮拆分和分流技術,將請求分發到多個服務器上,以提高系統的擴展性和性能。
總的來說,秒殺操作是一個具有挑戰性的問題,需要綜合考慮多個方面的解決方案。除了上述建議,還可以根據具體需求和情況,探索更多的優化方法和技術來實現高效且穩定的秒殺系統。
查看全部 -
【高并发的点】
详情页→开始前用户会不断刷新 解决方案:详情页部署到CDN上,不直接访问系统
系统时间→ 该处不用优化,因为不会访问后端
地址暴露接口→随着秒杀环节的进展会更换地址,无法使用CDN缓存 解决方案:使用redis服务端缓存后访问Mysql
执行秒杀操作→秒杀按钮,无法使用CDN缓存,因为库存时效问题也不能使用后端缓存,一瞬间会产生大量竞争 解决方案:下一章
【CDN】
内容分发网络,一般互联网公司会有,
静态内容部署在上面加速用户访问,
会部署在离用户最近的网络节点上,
命中CDN后就不需要访问后端服务器
查看全部 -
此处的断点调试方法可以学习
查看全部 -
秒杀系统架构
查看全部 -
MySQL低效
查看全部 -
运维成本分析
查看全部 -
秒杀技术方案分析
查看全部 -
秒杀地址接口优化
查看全部 -
高并发分析
查看全部 -
MySQL效率低下的原因是因为行级锁,当一个线程进行对行资源的操作时,下一个线程必须等待这个线程完成commit 或者 rollback 操作释放锁才能进行操作
查看全部
举报