当前位置:网站首页>【Redis实现秒杀业务①】秒杀流程概述|基本业务实现
【Redis实现秒杀业务①】秒杀流程概述|基本业务实现
2022-06-24 07:28:00 【步尔斯特】
小伙伴们,从今天开始,我们一起用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("抢购水果成功,去步尔斯特的主页看看吧!");
}
边栏推荐
- Deep learning and neural networks: the six most noteworthy trends
- 怎么把mdf和ldf文件导入MySQL workbench中
- OpenCV每日函数 结构分析和形状描述符(7) 寻找多边形(轮廓)/旋转矩形交集
- How does the tunnel mobile inspection track robot monitor 24 hours to ensure the safety of tunnel construction?
- [noi simulation] pendulum (linear algebra, Du Jiao sieve)
- Data middle office: middle office architecture and overview
- 用VNC Viewer的方式远程连接无需显示屏的树莓派
- Spark - LeftOuterJoin 结果条数与左表条数不一致
- 【NOI模拟赛】给国与时光鸡(构造)
- threejs辉光通道01(UnrealBloomPass && layers)
猜你喜欢
随机推荐
Kaformer personal notes
MySQL | view notes on Master Kong MySQL from introduction to advanced
从华为WeAutomate数字机器人论坛,看政企领域的“政务新智理”
How does the tunnel mobile inspection track robot monitor 24 hours to ensure the safety of tunnel construction?
[Niuke] convert string to integer
嵌入式 | 硬件转软件的几条建议
【MySQL从入门到精通】【高级篇】(一)字符集的修改与底层原理
Idea another line shortcut
threejs辉光通道01(UnrealBloomPass && layers)
uniapp 开发多端项目如何配置环境变量以及区分环境打包
Floating error waiting for changelog lock
1704. 判断字符串的两半是否相似
Fast and slow pointer series
快慢指针系列
Analyze the meaning of Internet advertising terms CPM, CPC, CPA, CPS, CPL and CPR
2138. splitting a string into groups of length k
Squid代理服务器应用
216. combined summation III enumeration method
Sword finger offer 55 - I. depth DFS method of binary tree
[noi Simulation Competition] send (tree DP)









