场景:
商城对某一商品进行秒杀活动,该项目实例中,商品为watch,库存为10,使用jemter测试工具来模拟高并发场景
代码实例:
mysql表结构:
库存表: 订单表:
application.yml文件
server:
port: 8089
spring:
rabbitmq:
virtual-host: /
host: localhost
username: guest
password: guest
application:
name: concurrency-project
redis:
host: localhost
port: 6379
jedis:
pool:
max-active: 1024
max-wait: -1s
max-idle: 200
password: 123456
datasource:
name: db_concurrency
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_concurrency
username: root
password:
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
mybatis:
mapper-locations: mapper/*.xml
type-aliases-package: com.concurrency.concurrencyproject.model
pagehelper:
helper-dialect: mysql
mapper:
mappers: com.concurrency.concurrencyproject.base.service.GenericMapper
not-empty: false
identity: MYSQL
项目启动类:
@SpringBootApplication
@MapperScan("com.concurrency.concurrencyproject.mapper")
public class ConcurrencyProjectApplication implements ApplicationRunner {
public static void main(String[] args) {
SpringApplication.run(ConcurrencyProjectApplication.class, args);
}
@Autowired
private RedisService redisService;
/**
* redis初始化各商品的库存量
*
* @param args
* @throws Exception
*/
@Override
public void run(ApplicationArguments args) throws Exception {
redisService.put("watch", 10, 20);
}
}
启动之后redis初始化为:
RabbitMQ配置类:
@Configuration
public class MyRabbitMQConfig {
//库存交换机
public static final String STORY_EXCHANGE = "STORY_EXCHANGE";
//订单交换机
public static final String ORDER_EXCHANGE = "ORDER_EXCHANGE";
//库存队列
public static fina