1. 秒杀业务下需要解决的问题有哪些?
秒杀业务当然对于系统服务的可用性要求、以及数据的一致性是要求非常严格的,当然服务的高可以可以通过服务器集群化来解决,而数据的一致的的话这个解决起来要复杂很多,可能我们习惯会用sychronized来解决秒杀系统下的超卖问题,但是这样是有局限性的,sychronized会使得我们的服务器的请求响应速度变慢,并且sychronized并不适合分布式系统,而我们如果使用redis实现分布式锁就可以很好的解决以上问题。
2. 秒杀业务原始实现代码
2.1 秒杀业务逻辑实现类 SecKillServiceImpl
@Service
public class SecKillServiceImpl implements SecKillService {
/**
* 国庆活动,皮蛋粥特价,限量100000份
*/
static Map<String,Integer> products;
static Map<String,Integer> stock;
static Map<String,String> orders;
static
{
/**
* 模拟多个表,商品信息表,库存表,秒杀成功订单表
*/
products = new HashMap<>();
stock = new HashMap<>();
orders = new HashMap<>();
products.put("123456", 100000);
stock.put("123456", 100000);
}
/**
* 查询秒杀活动特价商品的信息
*
* @param productId
* @return
*/
@Override
public String querySecKillProductInfo(String productId) {
return "国庆活动,皮蛋粥特价,限量份"
+ products.get(productId)
+" 还剩:" + stock.get(productId)+" 份"
+" 该商品成功下单用户数目:"
+ orders.size() +" 人" ;
}
/**
* 模拟不同用户秒杀同一商品的请求
*
* @param productId
* @return
*/
@Override
public void orderProductMockDiffUser(String productId) {
//1.查询该商品库存,为0则活动结束。
int stockNum = stock.get(productId);
if(stockNum == 0) {
throw new SellException(100,"活动结束");
}else {
//2.下单(模拟不同用户openid不同)
orders.put(KeyUtil.genUniqueKey