有图有真相的QQ资源、网赚教程分享,高质量的网络教程和软件下载
保存到桌面加入收藏设为首页
冷牛教程网
当前位置:首页 > 技术文章 > Redis

Redis分布式锁实现商品库存秒杀抢购

2021-08-07 01:22:08   admin      408  
 final String REDIS_IP="xxxx";
Jedis jedis1 = new Jedis(REDIS_IP);
        // 初始化库存数量
        jedis1.set("OriginTestNum","5");
        int testThread=1000;
        final CountDownLatch CDL=new CountDownLatch(testThread);
        for (int i = 0; i < testThread; i++) {
            new Thread(()->{
                CDL.countDown();
                try {
                    CDL.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Jedis jedis = new Jedis(REDIS_IP);
                // 开抢前显示的数量
                int num1;
                num1=Integer.valueOf(jedis.get("OriginTestNum"));
                if(num1<=0){
                    System.out.println("库存已无");
                    return;
                }
                for(int j=0;j<2000&&Integer.valueOf(jedis.get("OriginTestNum"))>0
                        // 先查询数量,如果库存没了就不去查询分布式锁了,提升速度。
                &&!(jedis.setnx("OriginTestNum111","1")!=0);j++
                        ){
                    // 没抢到锁,延时继续
                    try {
//                        System.out.println("线程"+Thread.currentThread().getName()+"没获得锁,等待");
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if(j==1999){
                        // 最后一次执行,还没完事,直接返回超时
                        System.out.println("超时了");
                    }
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                     // 获取锁成功
                     // 再次确认下,保证数据一致性
                     num=Integer.parseInt(jedis.get("OriginTestNum"));
                     // 防止释放锁之前出异常,设置锁定时释放
                     jedis.expire("OriginTestNum111",30);
                     if(num>0){
                         jedis.set("OriginTestNum",(--num)+"");
                         System.out.println("抢到手了"+Thread.currentThread().getName());
                     }else{
                         System.out.println("抢光了");
                     }
                 // 释放锁
                jedis.del("OriginTestNum");
                jedis.close();
            }).start();
        }

上一篇:没有了
下一篇:16个Redis常见使用场景总结
相关评论
冷牛网络 2015-2021 版权所有  豫ICP备2021000561号-1