Redis——实现乐观锁

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lhc2207221755/article/details/80836093

核心代码:

 try {
                Thread.sleep((int)Math.random()*5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            while (true){
                try{
                    jedis.watch(key);
                    System.out.println("顾客:" + clientName + "开始抢商品");
                    System.out.println("当前商品的个数:"+jedis.get(key));
                    int prdNum = Integer.parseInt(jedis.get(key));// 当前商品个数
                    if(prdNum>0){
                        Transaction transaction = jedis.multi();
                        transaction.set(key, String.valueOf(prdNum - 1));
                        List<Object> result = transaction.exec();
                        if (result == null || result.isEmpty()) {
                            System.out.println("悲剧了,顾客:" + clientName + "没有抢到商品");// 可能是watch-key被外部修改,或者是数据操作被驳回
                        } else {
                            jedis.sadd(clientList, clientName);// 抢到商品记录一下
                            System.out.println("好高兴,顾客:" + clientName + "抢到商品");
                            break;
                        }
                    } else {
                        System.out.println("悲剧了,库存为0,顾客:" + clientName + "没有抢到商品");
                        break;
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    jedis.unwatch();
                    RedisUtil.returnResource(jedis);
                }
            }


        }

redis实现乐观锁比较简单,主要思路就是watch一个key的变动,并在watch和unwatch之间做一个类似事务操作,只有当事务操作成功,整体循环才会跳出,当然,当操作期间watch的key变动时候,提交事务操作时候,事务操作将会被取消。

猜你喜欢

转载自blog.csdn.net/lhc2207221755/article/details/80836093