Java连接Redis_Jedis_事务(multi-开启,exec-执行,discard-中断)

·  阅读 464

redis事务

1.redis的简单事务:>redis提供了简单的事务,不支持事务回滚

一组需要一起执行的命令放到multi和exec两个命令之间,其中multi代表事务开始,exec代表事务结束。

image.png

java:Jedis事务的相关代码:(Redis事务管理对象,其位于redis.clients.jedis.Transaction下。)

    @Test
    public void test01(){
        Jedis jedis = new Jedis("localhost",6379);
        //返回一个事务控制对象
        Transaction transaction = jedis.multi();
        transaction.select(5);
        //预先在事务对象中装入要执行的操作
        transaction.set("key1","value1");
        transaction.set("key2","value2");
        transaction.set("key3","value3");
        //执行事务
        transaction.exec();
    }
复制代码

2.停止事务discard

 @Test
    public void test02(){
        Jedis jedis = new Jedis("localhost",6379);
        Transaction transaction = jedis.multi();
        transaction.select(5);
        transaction.set("key2","value22");
        //中断事务,类似回滚
        transaction.discard();
    }

复制代码

3.watch命令

通俗点讲,watch命令就是标记一个键,如果标记了一个键, 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中重新再尝试一次。

 /**
     * 通俗点讲,watch命令就是标记一个键,如果标记了一个键,
     * 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中
     * 重新再尝试一次。
     *
     * 首先标记了balance,然后检查余额是否足够,不足就取消标记,并不做扣减;
     * 足够的话,就启动事务进行更新操作。
     * 如果在此期间键balance被其他人修改,拿在提交事务(执行exec)时就会报错,
     * 程序中通常可以捕获这类错误再重新执行一次,直到成功。
     * */
    public static void consumption(Integer money){
        Jedis redis = new Jedis("localhost",6379);
        int balance = 100;//余额100;
        redis.select(5);//使用db4
        redis.set("balance", String.valueOf(balance));
        redis.watch("balance");
        //redis.set("balance", String.valueOf(50));//此句不该出现,为了模拟其他程序已经修改了该条目 
        balance = Integer.parseInt(redis.get("balance"));
        System.out.println(balance);
        if (money > balance){
            System.out.println("余额不足"+money+"不能消费");
            redis.unwatch();
            return;
        }else {
            Transaction transaction = redis.multi();
            transaction.decrBy("balance",money);
            transaction.exec();//执行事务
            balance = Integer.parseInt(redis.get("balance"));
            System.out.println("扣费transaction事务执行结束...");
            System.out.println("消费"+money+"还剩余额"+balance);
            return;
        }
    }
复制代码
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改