小伙伴们,从今天开始,我们一起用Redis来实现秒杀业务,要一起加油啊!
我们大概的思路就是设计一个水果秒杀小项目。
首先我们会有一种水果,该水果拥有名字、数量、抢购开始时间和抢购结束时间。
业务流程
- 秒杀是否开始或结束,如果尚未开始或已经结束则无法下单
- 库存是否充足,不足则无法下单
水果实体类
/**
* 水果
*
* @author issavior
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Fruits implements Serializable {
private static final long serialVersionUID = 1;
private Long id;
private String name;
private Integer count;
private Date startTime;
private Date endTime;
}
新增水果
Controller
/**
* @author issavior
*/
@RestController
@RequestMapping("/seckill")
public class SeckillController {
@Autowired
private SeckillService seckillService;
/**
* 新增水果
* @param fruits 水果
* @return ResponseEntity<Object>
*/
@PostMapping
public ResponseEntity<Object> insertFruits(@RequestBody Fruits fruits) {
return seckillService.insertFruits(fruits);
}
}
ServiceImpl
/**
* @author issavior
*/
@Service
public class SeckillServiceImpl implements SeckillService {
@Autowired
private SeckillMapper seckillMapper;
@Autowired
private RedisIdWorker redisIdWorker;
/**
* 新增水果
*
* @param fruits 新增的水果数据
* @return ResponseEntity<Object>
*/
@Override
public ResponseEntity<Object> insertFruits(Fruits fruits) {
// 全局唯一ID工具类,详情可见系列文章上一篇
long id = redisIdWorker.nextId("seckill:fruits");
fruits.setId(id);
int successFlag = seckillMapper.insertFruits(fruits);
if (successFlag == 0) {
return ResponseEntity.status(400).body("新增失败");
}
return ResponseEntity.ok("新增成功");
}
}
秒杀业务基本实现
/**
* 抢购水果
*
* @param id 抢购水果的主键ID
* @return ResponseEntity<Object>
*/
@PostMapping("/{id}")
public ResponseEntity<Object> seckillFruits(@PathVariable("id") Long id) {
return seckillService.seckillFruits(id);
}
/**
* 抢购水果
*
* @param id 抢购水果的ID
* @return ResponseEntity<Object>
*/
@Override
public ResponseEntity<Object> seckillFruits(Long id) {
Fruits fruits = seckillMapper.selectFruits(id);
if (fruits == null) {
return ResponseEntity.status(400).body("水果卖光了,下次再来吧!");
}
LocalDateTime startTime = fruits.getStartTime();
LocalDateTime endTime = fruits.getEndTime();
Integer count = fruits.getCount();
if (startTime.isAfter(LocalDateTime.now())) {
return ResponseEntity.status(400).body("活动还没开始,去步尔斯特的主页看看吧!!");
}
if (endTime.isBefore(LocalDateTime.now())) {
return ResponseEntity.status(400).body("活动已经结束了,去步尔斯特的主页看看吧!!");
}
if (count < 1) {
return ResponseEntity.status(400).body("没有库存了,去步尔斯特的主页看看吧!!");
}
int updateFruits = seckillMapper.updateFruits(id);
if (updateFruits == 0) {
return ResponseEntity.status(400).body("水果卖光了,下次再来吧!");
}
return ResponseEntity.ok("抢购水果成功,去步尔斯特的主页看看吧!");
}