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  阅读(2841)  评论(0编辑  收藏  举报