Java操作Redis事务
package com.example.redis.other; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; import java.util.List; public class TestTransaction { public static void main(String[] args) throws InterruptedException { boolean isSuccess = isSuccess("balance", "debt", 20l); System.out.println("main retVal-------"+isSuccess); } public static boolean isSuccess(String balance,String debt,Long delAmount) throws InterruptedException { Jedis jedis = new Jedis("127.0.0.1",6379);
// Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 jedis.watch(balance); Long amount = Long.parseLong(jedis.get(balance)); Long debts = Long.parseLong(jedis.get(debt)); if(amount<delAmount){
//Redis Unwatch 命令用于取消 WATCH 命令对所有 key 的监视。 jedis.unwatch(); System.out.println("amount can't Less than delAmount !!!!"); return false; } {
//Redis 通过 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务 Transaction transaction = jedis.multi(); transaction.decrBy(balance, delAmount); transaction.incrBy(debt,delAmount); //在这里模拟网络延迟时,我们通过redis命令窗口手动去修改balance值。
Thread.sleep(3000); List<Object> exec = transaction.exec(); //执行exec操作时发现balance值被修改,因此终止操作。 if(exec.size()<=0){ System.out.println("balance is upfated by other person,debt is fail!!!"); return false; }
System.out.println("After updated balance== "+Long.parseLong(jedis.get(balance))); System.out.println("After updated debt== "+Long.parseLong(jedis.get(debt))); return true; } } }
posted on 2020-05-13 17:36 Eugene_Jin 阅读(2863) 评论(0) 编辑 收藏 举报