java redis 实现乐观锁_基于redis的高并发秒杀的JAVA-DEMO实现!基于redis watch乐观锁...

public static void testWatch() throws Exception {

Jedis jedis = null;

try {

jedis = ConnectionManager.getConnection();// 获取jedis连接

String key_s = "user_name";// 抢到的用户

String key = "test_count";// 商品数量

String clientName = UUID.randomUUID().toString().replace("-", "");// 用户名字

while (true) {

try {

jedis.watch(key);// 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 result = transaction.exec();// 原子性提交事物

if (result == null || result.isEmpty()) {

System.out.println("用户:" + clientName + "没有抢到商品");// 可能是watch-key被外部修改,或者是数据操作被驳回

} else {

jedis.sadd(key_s, clientName);// 将抢到的用户存起来

System.out.println("用户:" + clientName + "抢到商品");

break;

}

} else {

System.out.println("库存为0,用户:" + clientName + "没有抢到商品");

break;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

jedis.unwatch();// exec,discard,unwatch命令都会清除连接中的所有监视

}

} // while

} catch (Exception e) {

// TODO: handle exception

System.out.println("redis bug:" + e.getMessage());

} finally {

// 释放jedis连接

try {

ConnectionManager.closeConnection(jedis);

} catch (Exception e) {

System.out.println("redis bug:" + e.getMessage());

// TODO Auto-generated catch block

}

}

}

基本逻辑

1,设置key为500个商品

2,jedis.watch(key);//key加上乐观锁

3,Transaction transaction = jedis.multi();//标记一个事务块的开始。

4,transaction.set(key, String.valueOf(prdNum – 1));//修改value

5,List result = transaction.exec();//原子性执行事物 result == null || result.isEmpty() 都是失败

6,jedis.unwatch();// exec,discard,unwatch命令都会清除连接中的所有监视

7,ConnectionManager.closeConnection(jedis);//释放jedis连接 这个应该都知道。。。。。。。。

楼主已用 500个线程测试过OK的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值