【开发技巧】-- 使用同步关键字sychronized与基于redis分布式锁分别实现秒杀业务

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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值