redis的一些知识-redis事务multi

redis是有事务的,但是不同于mysql的事务。

redis的事务是由multi和exec包围起来的部分,当发出multi命令时,redis会进入事务,redis会进入阻塞状态,不再响应任何别的客户端的请求,直到发出multi命令的客户端再发出exec命令为止。那么被multi和exec包围的命令会进入独享redis的过程,直到执行完毕。

事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。而一旦客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。

那么在事务过程中出错了怎么办?注意,这里只考虑运行时错误,不考虑redis语法错误,因为通过redis的api进行的命令是没有语法上的错误的。如果需要执行1,2,3个步骤,其中2在运行时出错了,那么不像mysql的事务那样会回滚,redis是继续往下执行,直到执行完毕,该事务算结束。

注意,redis是不会回滚的。

通过这种简单的独享型的事务机制,redis能避免多个客户端同时访问时,出现读写不一致的情况,来完成原子性事务。

spring data redis提供的RedisTemplate中有使用事务的方法,代码如下:

//execute a transaction
List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() {
  public List<Object> execute(RedisOperations operations) throws DataAccessException {
    operations.multi();
    operations.opsForSet().add("key", "value1");

    // This will contain the results of all ops in the transaction
    return operations.exec();
  }
});
System.out.println("Number of items added to set: " + txResults.get(0));
即是在SessionCallback回调方法中,通过multi和exec来包围的部分。
和pipeline类似,返回值也是一个List,就是执行的各命令结果的集合。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天涯泪小武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值