視頻地址:http://www.imooc.com/learn/587
1.分析秒殺系統的業務流程
商家&庫存&用戶之間的關系
2.用戶對庫存的業務分析
用戶執行秒殺->減庫存+記錄購買明細
3.對購買行為的分析(表數據字段的依據)
購買的對象
購買的時間/付款有效期
付款信息/發貨信息
4.如果用戶的購買行為沒有事物控制
減庫存,沒有購買記錄 --> 少賣 --> 客戶無法看到秒殺結果
庫存沒減,產生購買記錄 --> 超賣 --> 商家沒有足夠的庫存發貨
5.數據落地問題MYSQL VS NOSQL
什么是NOSQL:所有的非關系型數據庫的存儲方案
常見的NOSQL:redis hbase Cassandra ElasticSearch
NOSQL的優勢:性能 高可用 分布式
NOSQL的劣勢:對於事務的支持不太友好
結論:事務機制機制依然是最可靠的數據落地方案
6.秒殺系統的業務難點
分析高並發導致的性能問題:
start transaction -- 開啟事務
update 減庫存 -- 減庫存操作
insert 購買記錄 -- 插入購買記錄
commit -- 事務提交
在秒殺開啟的時候由於同時產生減庫存請求(高並發入庫),在事務開啟中由於mysql行級鎖機制
導致每次減庫存操作都應該在上一次事務結束之后才能操作否則會一直等待,由此產生高並發的性能問題
7.秒殺系統的主要功能
秒殺接口的暴露 -- 避免插件實現重復秒殺
執行秒殺
數據相關查詢
8.秒殺系統的主要開發流程
DAO設計編碼 -- 數據庫表的設計、DAO接口的設計、使用Mybatis實現DAO接口
Service設計編碼 -- Service的接口設計、Service的接口實現、使用Spring管理Service、通過Spring聲明式事務管理事務方法
Web設計編碼 -- Restful接口的設計、前端交互的編碼
-- 數據庫初始化腳本 -- 創建數據庫 CREATE DATABASE seckill; -- 使用數據庫 USE seckill; -- 創建表秒殺庫存表 CREATE TABLE seckill( `seckill_id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品庫存id', `name` varchar(120) NOT NULL COMMENT '商品名稱', `number` int NOT NULL COMMENT '商品庫存', `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒殺開始時間', `end_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒殺結束時間', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒殺創建時間', PRIMARY KEY (seckill_id), key idx_start_time(start_time), key idx_end_time(end_time), key idx_create_time(create_time) )ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT '秒殺庫存表'; /* 注意mysql5.7創建seckill表時會報 ERROR 1067 (42000): Invalid default value for 'end_time' 解決方式1: set sql_mode = ''; 查詢sql_mode: show variables like 'sql_mode'; 解決方式2:為timestamp類型的字段添加默認值 */ -- 初始化數據 insert into seckill(name,number,start_time,end_time) values ('1000元秒殺iphone7s',100,'2017-04-14 00:00:00','2017-04-15 00:00:00'), ('800元秒殺ipadAir',150,'2017-04-14 00:00:00','2017-04-15 00:00:00'), ('500元秒殺華為P9',200,'2017-04-14 00:00:00','2017-04-15 00:00:00'), ('200元秒殺紅米NOTE',300,'2017-04-14 00:00:00','2017-04-15 00:00:00'); -- 秒殺成功明細表 -- 用戶登陸驗證相關的信息,驗證用戶身份 CREATE TABLE success_killed( `seckill_id` bigint NOT NULL COMMENT '秒殺商品id', `user_phone` bigint NOT NULL COMMENT '用戶手機號', `state` tinyint NOT NULL DEFAULT -1 COMMENT '狀態標識:-1:無效 0:成功 1:已付款', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒殺成功時間', PRIMARY KEY (seckill_id,user_phone) /*聯合主鍵,保證同一個用戶對同一商品不會多次秒殺*/, key idx_create_time(create_time) )ENGINE InnoDB DEFAULT CHARSET=utf8 COMMENT '秒殺成功明細表'; -- 連接數據庫控制台 -- 導入初始化數據 -- 查詢表結構: show create table [table_name]\G -- 建表模板 CREATE TABLE XXX( `pid` bigint NOT NULL AUTO_INCREMENT COMMENT '邏輯主鍵', PRIMARY KEY (pid), /*主鍵設置*/ KEY idx_pid (pid) /*創建索引*/ )ENGINE InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '表信息'; -- 為什么要手寫DDL -- 1.方便其他同時/DBA查看數據庫的改變 ALTER TABLE seckill DROP INDEX idx_create_time, ADD INDEX idx_s_c(start_time,create_time); -- 2.數據庫的版本控制
mysql在windows本地zip安裝方式 1.配置環境變量 2.修改my-default.ini,添加 #安裝目錄 basedir=C:\Program1\mysql-5.7.16-winx64 #數據庫存放目錄 datadir=C:\Program1\mysql-5.7.16-winx64\data #端口 port=3306 #字符集 character_set_server=utf8 #最大連接數 max_connections=200 3.管理員身份運行CMD 輸入:mysqld --initialize-insecure 4.安裝服務 輸入:mysqld -install 5.啟動服務 輸入:net start mysql 6.進入mysql修改密碼 輸入:set password = password('新密碼'); 7.重啟mysql並登陸 net stop mysql