专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
芋道源码  ·  面试官常拷打:如何下保证MySQL数据库与R ... ·  15 小时前  
芋道源码  ·  盘点Lombok的几个骚操作 ·  15 小时前  
芋道源码  ·  SpringBoot 采用 ... ·  昨天  
芋道源码  ·  为什么王者荣耀不使用微服务架构? ·  2 天前  
51好读  ›  专栏  ›  ImportNew

高并发下的下单功能设计

ImportNew  · 公众号  · Java  · 2017-08-08 12:16

正文

(点击 上方公众号 ,可快速关注)


来源:常大皮卡丘,

blog.csdn.net/u013815546/article/details/53928912

如有好文章投稿,请点击 → 这里了解详情


功能需求:设计一个秒杀系统


初始方案


商品表设计:热销商品提供给用户秒杀,有初始库存。


@Entity

public class SecKillGoods implements Serializable{

@Id

private String id;

/**

* 剩余库存

*/

private Integer remainNum;

/**

* 秒杀商品名称

*/

private String goodsName;

}


秒杀订单表设计:记录秒杀成功的订单情况


@Entity

public class SecKillOrder implements Serializable {

@Id

@GenericGenerator(name = "PKUUID", strategy = "uuid2")

@GeneratedValue(generator = "PKUUID")

@Column(length = 36)

private String id;

//用户名称

private String consumer;

//秒杀产品编号

private String goodsId;

//购买数量

private Integer num;

}


Dao设计:主要就是一个减少库存方法,其他CRUD使用JPA自带的方法


public interface SecKillGoodsDao extends JpaRepository {

@Query("update SecKillGoods g set g.remainNum = g.remainNum - ?2 where g.id=?1")

@Modifying(clearAutomatically = true)

@Transactional

int reduceStock(String id,Integer remainNum);

}


数据初始化以及提供保存订单的操作:


@Service

public class SecKillService {

@Autowired

SecKillGoodsDao secKillGoodsDao;

@Autowired

SecKillOrderDao secKillOrderDao;

/**

* 程序启动时:

* 初始化秒杀商品,清空订单数据

*/

@PostConstruct

public void initSecKillEntity(){

secKillGoodsDao.deleteAll();

secKillOrderDao.deleteAll();

SecKillGoods secKillGoods = new SecKillGoods();

secKillGoods.setId("123456");

secKillGoods.setGoodsName("秒杀产品");

secKillGoods.setRemainNum(10);

secKillGoodsDao.save(secKillGoods);

}

/**

* 购买成功,保存订单

* @param consumer

* @param goodsId

* @param num

*/

public void generateOrder(String consumer, String goodsId, Integer num) {

secKillOrderDao.save(new SecKillOrder(consumer,goodsId,num));

}

}


下面就是controller层的设计


@Controller

public class SecKillController {

@Autowired

SecKillGoodsDao secKillGoodsDao;

@Autowired

SecKillService secKillService;

/**

* 普通写法

* @param consumer

* @param goodsId

* @return

*/

@RequestMapping("/seckill.html")

@ResponseBody

public String SecKill(String consumer,String goodsId,Integer num) throws InterruptedException {

//查找出用户要买的商品

SecKillGoods goods = secKillGoodsDao.findOne(goodsId);

//如果有这么多库存

if(goods.getRemainNum()>=num){

//模拟网络延时

Thread.sleep(1000);

//先减去库存

secKillGoodsDao.reduceStock(num);

//保存订单

secKillService.generateOrder(consumer,goodsId,num);

return "购买成功";

}

return "购买失败,库存不足";

}







请到「今天看啥」查看全文