├── .idea
├── compiler.xml
├── encodings.xml
├── inspectionProfiles
│ └── Project_Default.xml
├── libraries
│ ├── Maven__ch_qos_logback_logback_classic_1_1_7.xml
│ ├── Maven__ch_qos_logback_logback_core_1_1_7.xml
│ ├── Maven__com_alibaba_druid_1_0_18.xml
│ ├── Maven__com_alibaba_fastjson_1_2_31.xml
│ ├── Maven__com_fasterxml_classmate_1_3_1.xml
│ ├── Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_3.xml
│ ├── Maven__com_fasterxml_jackson_core_jackson_core_2_8_3.xml
│ ├── Maven__com_fasterxml_jackson_core_jackson_databind_2_8_3.xml
│ ├── Maven__com_jayway_jsonpath_json_path_2_2_0.xml
│ ├── Maven__com_rabbitmq_amqp_client_3_6_3.xml
│ ├── Maven__com_rabbitmq_http_client_1_0_0_RELEASE.xml
│ ├── Maven__commons_codec_commons_codec_1_10.xml
│ ├── Maven__javax_validation_validation_api_1_1_0_Final.xml
│ ├── Maven__junit_junit_4_12.xml
│ ├── Maven__mysql_mysql_connector_java_5_1_39.xml
│ ├── Maven__net_minidev_accessors_smart_1_1.xml
│ ├── Maven__net_minidev_json_smart_2_2_1.xml
│ ├── Maven__org_apache_commons_commons_pool2_2_4_2.xml
│ ├── Maven__org_apache_httpcomponents_httpclient_4_5_2.xml
│ ├── Maven__org_apache_httpcomponents_httpcore_4_4_5.xml
│ ├── Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_5.xml
│ ├── Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_5.xml
│ ├── Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_5.xml
│ ├── Maven__org_apache_tomcat_tomcat_jdbc_8_5_5.xml
│ ├── Maven__org_apache_tomcat_tomcat_juli_8_5_5.xml
│ ├── Maven__org_assertj_assertj_core_2_5_0.xml
│ ├── Maven__org_hamcrest_hamcrest_core_1_3.xml
│ ├── Maven__org_hamcrest_hamcrest_library_1_3.xml
│ ├── Maven__org_hibernate_hibernate_validator_5_2_4_Final.xml
│ ├── Maven__org_jboss_logging_jboss_logging_3_3_0_Final.xml
│ ├── Maven__org_json_json_20140107.xml
│ ├── Maven__org_mockito_mockito_core_1_10_19.xml
│ ├── Maven__org_mybatis_mybatis_3_4_0.xml
│ ├── Maven__org_mybatis_mybatis_spring_1_3_0.xml
│ ├── Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_1_1_1.xml
│ ├── Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_1_1_1.xml
│ ├── Maven__org_objenesis_objenesis_2_1.xml
│ ├── Maven__org_ow2_asm_asm_5_0_3.xml
│ ├── Maven__org_projectlombok_lombok_1_16_6.xml
│ ├── Maven__org_skyscreamer_jsonassert_1_3_0.xml
│ ├── Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml
│ ├── Maven__org_slf4j_jul_to_slf4j_1_7_21.xml
│ ├── Maven__org_slf4j_log4j_over_slf4j_1_7_21.xml
│ ├── Maven__org_slf4j_slf4j_api_1_7_21.xml
│ ├── Maven__org_springframework_amqp_spring_amqp_1_6_2_RELEASE.xml
│ ├── Maven__org_springframework_amqp_spring_rabbit_1_6_2_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_autoconfigure_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_starter_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_starter_amqp_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_starter_jdbc_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_starter_logging_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_starter_redis_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_starter_test_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_starter_tomcat_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_starter_web_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_test_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_4_1_RELEASE.xml
│ ├── Maven__org_springframework_data_spring_data_commons_1_12_3_RELEASE.xml
│ ├── Maven__org_springframework_data_spring_data_keyvalue_1_1_3_RELEASE.xml
│ ├── Maven__org_springframework_data_spring_data_redis_1_7_3_RELEASE.xml
│ ├── Maven__org_springframework_retry_spring_retry_1_1_4_RELEASE.xml
│ ├── Maven__org_springframework_spring_aop_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_beans_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_context_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_context_support_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_core_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_expression_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_jdbc_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_messaging_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_oxm_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_test_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_tx_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_web_4_3_3_RELEASE.xml
│ ├── Maven__org_springframework_spring_webmvc_4_3_3_RELEASE.xml
│ ├── Maven__org_yaml_snakeyaml_1_17.xml
│ └── Maven__redis_clients_jedis_2_8_1.xml
├── misc.xml
├── modules.xml
├── smartfox_info.xml
├── uiDesigner.xml
├── vcs.xml
└── workspace.xml
├── README.md
├── SecKillDesign.iml
├── pom.xml
└── src
├── main
├── java
│ └── com
│ │ └── scut
│ │ └── seckill
│ │ ├── SecKillApp.java
│ │ ├── cache
│ │ ├── RedisCacheHandle.java
│ │ └── RedisLoaderListener.java
│ │ ├── common
│ │ ├── GlobalExceptionHandler.java
│ │ ├── Head.java
│ │ ├── Message.java
│ │ └── SecKillEnum.java
│ │ ├── concurrent
│ │ └── AtomicStock.java
│ │ ├── config
│ │ ├── MyBatisConfig.java
│ │ ├── RabbitmqCallBackConfig.java
│ │ └── RedisCacheConfig.java
│ │ ├── constant
│ │ ├── RedisCacheConst.java
│ │ └── SecKillStateConst.java
│ │ ├── controller
│ │ └── SecKillController.java
│ │ ├── entity
│ │ ├── Product.java
│ │ ├── Record.java
│ │ └── User.java
│ │ ├── exception
│ │ └── SecKillException.java
│ │ ├── mapper
│ │ └── SecKillMapper.java
│ │ ├── mq
│ │ ├── RabbitMQReceiver.java
│ │ └── RabbitMQSender.java
│ │ ├── service
│ │ └── SecKillService.java
│ │ ├── utils
│ │ └── SecKillUtils.java
│ │ └── web
│ │ ├── req
│ │ └── SecKillRequest.java
│ │ └── vo
│ │ └── SecKillResponse.java
└── resources
│ ├── application.properties
│ ├── dao
│ └── SecKillMapper.xml
│ ├── jmeter
│ ├── data-config.png
│ ├── operation.txt
│ ├── origin.png
│ ├── param-repeat.txt
│ ├── param.txt
│ └── seckill.jmx
│ ├── sql
│ ├── insert.sql
│ └── seckill.sql
│ └── stress_test_result
│ ├── atomicInteger
│ ├── result_1.png
│ ├── result_2.png
│ └── result_3.png
│ ├── pessLockInMySQL
│ ├── result_1.png
│ ├── result_2.png
│ └── result_3.png
│ ├── posiLockInMySQL
│ ├── result_1.png
│ ├── result_2.png
│ └── result_3.png
│ └── posiLockInRedis
│ ├── result_1.png
│ ├── result_2.png
│ └── result_3.png
└── test
└── java
└── JUnitTest.java
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_7.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_7.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__com_alibaba_druid_1_0_18.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__com_alibaba_fastjson_1_2_31.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__com_fasterxml_classmate_1_3_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_8_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_8_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_2_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__com_rabbitmq_amqp_client_3_6_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__com_rabbitmq_http_client_1_0_0_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__commons_codec_commons_codec_1_10.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__junit_junit_4_12.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__mysql_mysql_connector_java_5_1_39.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__net_minidev_accessors_smart_1_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__net_minidev_json_smart_2_2_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_apache_commons_commons_pool2_2_4_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_5.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_5.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_5.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_5.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_apache_tomcat_tomcat_jdbc_8_5_5.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_apache_tomcat_tomcat_juli_8_5_5.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_assertj_assertj_core_2_5_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_hibernate_hibernate_validator_5_2_4_Final.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_0_Final.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_json_json_20140107.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_mockito_mockito_core_1_10_19.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_mybatis_mybatis_3_4_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_mybatis_mybatis_spring_1_3_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_1_1_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_1_1_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_objenesis_objenesis_2_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_ow2_asm_asm_5_0_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_projectlombok_lombok_1_16_6.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_3_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_21.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_slf4j_log4j_over_slf4j_1_7_21.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_21.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_amqp_spring_amqp_1_6_2_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_amqp_spring_rabbit_1_6_2_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_amqp_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_redis_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_4_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_data_spring_data_commons_1_12_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_data_spring_data_keyvalue_1_1_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_data_spring_data_redis_1_7_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_retry_spring_retry_1_1_4_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_aop_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_beans_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_context_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_context_support_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_core_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_expression_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_jdbc_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_messaging_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_oxm_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_test_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_tx_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_web_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_springframework_spring_webmvc_4_3_3_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__org_yaml_snakeyaml_1_17.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Maven__redis_clients_jedis_2_8_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/smartfox_info.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/uiDesigner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
7 |
8 | -
9 |
10 |
11 | -
12 |
13 |
14 | -
15 |
16 |
17 | -
18 |
19 |
20 |
21 |
22 |
23 | -
24 |
25 |
26 |
27 |
28 |
29 | -
30 |
31 |
32 |
33 |
34 |
35 | -
36 |
37 |
38 |
39 |
40 |
41 | -
42 |
43 |
44 |
45 |
46 | -
47 |
48 |
49 |
50 |
51 | -
52 |
53 |
54 |
55 |
56 | -
57 |
58 |
59 |
60 |
61 | -
62 |
63 |
64 |
65 |
66 | -
67 |
68 |
69 |
70 |
71 | -
72 |
73 |
74 | -
75 |
76 |
77 |
78 |
79 | -
80 |
81 |
82 |
83 |
84 | -
85 |
86 |
87 |
88 |
89 | -
90 |
91 |
92 |
93 |
94 | -
95 |
96 |
97 |
98 |
99 | -
100 |
101 |
102 | -
103 |
104 |
105 | -
106 |
107 |
108 | -
109 |
110 |
111 | -
112 |
113 |
114 |
115 |
116 | -
117 |
118 |
119 | -
120 |
121 |
122 |
123 |
124 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Java秒杀与抢购模型的架构设计与实现
2 | =======================
3 |
4 | 开发环境:
5 | -----------------------------------
6 | IntelliJ IDEA + Maven + Workbench
7 |
8 | 压测工具:
9 | -----------------------------------
10 | JMeter
11 |
12 | 使用框架:
13 | -----------------------------------
14 | Spring Boot + Mybatis + Redis + RabbitMQ
15 |
16 | 具体内容:
17 | -----------------------------------
18 | 对高并发高负载情形下的应用场景进行分析,以高效地处理资源竞争为目的,设计一个秒杀与抢购模型。
19 | 本项目提供了三种解决方案来比较系统的性能:
20 | 1.利用MySQL的update行锁实现悲观锁。
21 | 2.MySQL加字段version实现乐观锁。
22 | 3.基于AtomicInteger的CAS机制;
23 | 4.使用Redis作为原子计数器(watch事务+decr操作),RabbitMQ作为消息队列记录用户抢购行为,MySQL做异步存储。
24 | 上述四个解决方案均使用了JMeter进行压力与性能测试(实验设置的是10秒内产生3000个请求),分析其吞吐量、平均响应时间、错误率等参数,最后得出相应结论。
25 |
26 | 实验结果:
27 | -----------------------------------
28 | 实验结果表明:
29 | 四种方案的响应错误率均为零,但是吞吐量不一样,
30 | 总体来说第一种和第四种方案的吞吐量相当,平均响应时间也较快;
31 | 第三种方案的吞吐量慢于上述两种,CAS机制效果不错。
32 | 第二种方案的响应时间最慢,原因是高并发情形下多个线程不断回滚,耗费了大量的CPU资源,导致性能低下。
33 |
34 |
35 | 备注:
36 | -----------------------------------
37 | 1.此项目包含了sql文件,包括表单创建和添加数据。
38 | 2.包含了JMeter配置图片与实验结果图片
39 | 3.包含了测试数据集:param.txt。第一个参数代表用户ID,第二个参数代表产品ID。
40 |
41 | 核心代码:
42 | -----------------------------------
43 | ### MySQL悲观锁
44 | @Transactional
45 | public SecKillEnum handleByPessLockInMySQL(Map paramMap) {
46 | Jedis jedis = redisCacheHandle.getJedis();
47 | Record record = null;
48 | Integer userId = (Integer) paramMap.get("userId");
49 | Integer productId = (Integer)paramMap.get("productId");
50 | User user = new User(userId);
51 | Product product = secKillMapper.getProductById(productId);
52 | String hasBoughtSetKey = SecKillUtils.getRedisHasBoughtSetKey(product.getProductName());
53 |
54 | //判断是否重复购买
55 | boolean isBuy = jedis.sismember(hasBoughtSetKey, user.getId().toString());
56 | if (isBuy){
57 | //重复秒杀
58 | throw new SecKillException(SecKillEnum.REPEAT);
59 | }
60 | boolean secKillSuccess = secKillMapper.updatePessLockInMySQL(product);
61 | if (!secKillSuccess){
62 | //库存不足
63 | throw new SecKillException(SecKillEnum.LOW_STOCKS);
64 | }
65 |
66 | //秒杀成功
67 | record = new Record(null,user,product,SecKillEnum.SUCCESS.getCode(),SecKillEnum.SUCCESS.getMessage(),new Date());
68 | log.info(record.toString());
69 | boolean insertFlag = secKillMapper.insertRecord(record);
70 | //插入record成功
71 | if (insertFlag){
72 | long addResult = jedis.sadd(hasBoughtSetKey,user.getId().toString());
73 | if (addResult>0){
74 | log.info("---------秒杀成功");
75 | return SecKillEnum.SUCCESS;
76 | }else {
77 | throw new SecKillException(SecKillEnum.REPEAT);
78 | }
79 | }else {
80 | throw new SecKillException(SecKillEnum.SYSTEM_EXCEPTION);
81 | }
82 | }
83 |
84 | ### MySQL乐观锁
85 | @Transactional
86 | public SecKillEnum handleByPosiLockInMySQL(Map paramMap){
87 | Jedis jedis = redisCacheHandle.getJedis();
88 | Record record = null;
89 | Integer userId = (Integer) paramMap.get("userId");
90 | Integer productId = (Integer)paramMap.get("productId");
91 | User user = new User(userId);
92 | Product product = secKillMapper.getProductById(productId);
93 | String hasBoughtSetKey = SecKillUtils.getRedisHasBoughtSetKey(product.getProductName());
94 |
95 | //判断是否重复购买
96 | boolean isBuy = jedis.sismember(hasBoughtSetKey, user.getId().toString());
97 | if (isBuy){
98 | //重复秒杀
99 | throw new SecKillException(SecKillEnum.REPEAT);
100 | }
101 | //库存减一
102 | int lastStock = product.getStock()-1;
103 | if (lastStock>=0){
104 | product.setStock(lastStock);
105 | boolean secKillSuccess = secKillMapper.updatePosiLockInMySQL(product);
106 | if (!secKillSuccess){
107 | //秒杀失败,version被修改
108 | throw new SecKillException(SecKillEnum.FAIL);
109 | }
110 | }else {
111 | //库存不足
112 | throw new SecKillException(SecKillEnum.LOW_STOCKS);
113 | }
114 |
115 | record = new Record(null,user,product,SecKillEnum.SUCCESS.getCode(),SecKillEnum.SUCCESS.getMessage(),new Date());
116 | log.info(record.toString());
117 | boolean insertFlag = secKillMapper.insertRecord(record);
118 | //插入record成功
119 | if (insertFlag){
120 | long addResult = jedis.sadd(hasBoughtSetKey,user.getId().toString());
121 | if (addResult>0){
122 | //秒杀成功
123 | return SecKillEnum.SUCCESS;
124 | }else {
125 | //重复秒杀
126 | log.info("---------重复秒杀");
127 | throw new SecKillException(SecKillEnum.REPEAT);
128 | }
129 | }else {
130 | //系统错误
131 | throw new SecKillException(SecKillEnum.SYSTEM_EXCEPTION);
132 | }
133 | }
134 |
135 | ### redis的watch监控
136 | public SecKillEnum handleByRedisWatch(Map paramMap) {
137 | Jedis jedis = redisCacheHandle.getJedis();
138 | Record record = null;
139 | Integer userId = (Integer) paramMap.get("userId");
140 | Integer productId = (Integer)paramMap.get("productId");
141 | User user = new User(userId);
142 | String productName = jedis.get("product_"+productId);
143 | String productStockCacheKey = productName+"_stock";
144 | String hasBoughtSetKey = SecKillUtils.getRedisHasBoughtSetKey(productName);
145 |
146 | //watch开启监控
147 | jedis.watch(productStockCacheKey);
148 |
149 | //判断是否重复购买,注意这里高并发情形下并不安全
150 | boolean isBuy = jedis.sismember(hasBoughtSetKey, user.getId().toString());
151 | if (isBuy){
152 | //重复秒杀
153 | throw new SecKillException(SecKillEnum.REPEAT);
154 | }
155 |
156 | String stock = jedis.get(productStockCacheKey);
157 | if (Integer.parseInt(stock)<=0) {
158 | //库存不足
159 | throw new SecKillException(SecKillEnum.LOW_STOCKS);
160 | }
161 |
162 | //开启Redis事务
163 | Transaction tx = jedis.multi();
164 | //库存减一
165 | tx.decrBy(productStockCacheKey,1);
166 | //执行事务
167 | List