redis事务
1.redis的简单事务:>redis提供了简单的事务,不支持事务回滚
一组需要一起执行的命令放到multi和exec两个命令之间,其中multi代表事务开始,exec代表事务结束。
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;
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END