首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >redis的一些知识-redis事务multi

redis的一些知识-redis事务multi

作者头像
天涯泪小武
发布2019-01-17 11:51:38
发布2019-01-17 11:51:38
1.6K0
举报
文章被收录于专栏:SpringCloud专栏SpringCloud专栏

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中有使用事务的方法,代码如下:

代码语言:javascript
复制
//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,就是执行的各命令结果的集合。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年01月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档