【README】
redis的java客户端对键加锁和解锁(Jedis.watch() Jedis.unwatch() );
【1】代码
/*** redis加锁-watch * 【场景描述】: watch命令就是标记一个键,如果标记了一个键,* 在提交事务前如果该键被别人修改过,那事务提交就会失败;这种情况可以再重新尝试一次;* 首先标记了键 balance,然后检查余额是否足够,不足就取消标记,并不做扣减;* 足够的话,启动事务进行更新;* 如果在此期间,balance被其他人修改,那么在提交事务(执行exce)时就会报错;* 程序可以捕获此类错误并重新执行一次,直到成功; */public static void main(String[] args) {boolean shopResult = new RedisTxTest().doShopping();System.out.println("购物结果 " + shopResult); }/*** 购物刷信用卡 * @return*/public boolean doShopping() {Jedis redis = new Jedis("192.168.163.201", 6382);int balance; // 余额-初始为100 int debt; // 欠额 int realConsumeAmount = 10; // 实际消费额 boolean result = false; redis.watch("balance"); // 对键 balance 监听加锁 balance = Integer.valueOf(redis.get("balance")); if (realConsumeAmount > balance ) { // 若实际消费金额 大于 信用卡内余额,即不够刷,放弃本次事务的提交=返回 false redis.unwatch(); System.out.printf("消费失败,原因【信用卡额度不够】信用卡额度【%d】消费额【%d】\n", balance, realConsumeAmount); } else { // 若实际消费金额小于 信用卡内余额,即够刷, 可以扣款System.out.println("****** shopping tx ******");Transaction tx = redis.multi(); // 开启事务 tx.decrBy("balance", realConsumeAmount); // 减去余额tx.incrBy("debt", realConsumeAmount); // 增加欠额tx.exec(); // 提交事务 /** 提交事务后,获取余额 和 欠额 */balance = Integer.valueOf(redis.get("balance"));debt = Integer.valueOf(redis.get("debt"));System.out.printf("消费扣款【%d】元成功后, 信用卡余额【%d】,欠额【%d】", realConsumeAmount, balance, debt); result = true; }// 记得关闭redis连接 redis.close();return result; }