版权声明:本文为博主原创文章,未经博主允许不得转载。 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变动时候,提交事务操作时候,事务操作将会被取消。