最佳实践秒杀六(Redis原子递减)

This commit is contained in:
小柒2012
2020-09-01 21:31:24 +08:00
parent 607f323452
commit 7ee7f9db8f
2 changed files with 67 additions and 2 deletions

View File

@@ -180,4 +180,45 @@ public class SeckillDistributedController {
}
return Result.ok();
}
@ApiOperation(value="秒杀六(Redis原子递减)",nickname="爪哇笔记")
@PostMapping("/startRedisCount")
public Result startRedisCount(long secKillId){
/**
* 还原数据
*/
seckillService.deleteSeckill(secKillId);
int count = 1000;
/**
* 初始化商品个数
*/
redisUtil.cacheValue(secKillId+"-num",100);
final long killId = secKillId;
LOGGER.info("开始秒杀六");
for(int i=0;i<count;i++){
final long userId = i;
Runnable task = () -> {
/**
* 原子递减
*/
long number = redisUtil.decr(secKillId+"-num",1);
if(number>=0){
seckillService.startSeckilAopLock(secKillId, userId);
LOGGER.info("用户:{}秒杀商品成功",userId);
}else{
LOGGER.info("用户:{}秒杀商品失败",userId);
}
};
executor.execute(task);
}
try {
Thread.sleep(10000);
redisUtil.cacheValue(killId+"", null);
Long secKillCount = seckillService.getSeckillCount(secKillId);
LOGGER.info("一共秒杀出{}件商品",secKillCount);
} catch (InterruptedException e) {
e.printStackTrace();
}
return Result.ok();
}
}

View File

@@ -1,5 +1,6 @@
package com.itstyle.seckill.web;
import com.itstyle.seckill.common.redis.RedisUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -9,6 +10,8 @@ import javax.jms.Destination;
import javax.servlet.http.HttpServletRequest;
import org.apache.activemq.command.ActiveMQQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
@@ -30,12 +33,17 @@ import com.itstyle.seckill.service.ISeckillService;
@RestController
@RequestMapping("/seckillPage")
public class SeckillPageController {
@Autowired
private final static Logger LOGGER = LoggerFactory.getLogger(SeckillPageController.class);
@Autowired
private ISeckillService seckillService;
@Autowired
private ActiveMQSender activeMQSender;
@Autowired
private RedisUtil redisUtil;
@Autowired
private HttpClient httpClient;
@@ -82,4 +90,20 @@ public class SeckillPageController {
return Result.error("验证失败");
}
}
@ApiOperation(value="最佳实践)",nickname="爪哇笔记")
@PostMapping("/startRedisCount")
public Result startRedisCount(long secKillId,long userId){
/**
* 原子递减
*/
long number = redisUtil.decr(secKillId+"-num",1);
if(number>=0){
seckillService.startSeckilDBPCC_TWO(secKillId, userId);
LOGGER.info("用户:{}秒杀商品成功",userId);
}else{
LOGGER.info("用户:{}秒杀商品失败",userId);
}
return Result.ok();
}
}