使用场景

redis一个命令执行是单线程的,不用担心并发冲突,如果你想有几个命令想像一个命令一样,在这几个命令执行过程中不会执行别的客户端发来的命令 ,也就是原子性,就可以用 redis Transaction

使用方式

redis 命令

multi // 标识事务起始
command-1
command-2
command-3
exec // 开始执行

redis-server 再接收到 exec 命令的时候,才真正开始顺序执行事务里的命令,然后返回全部命令执行结果

可以用 discard 命令取消事务

使用 Jedis 执行 Transaction (官方例子)

jedis的api和原始 redis 命令非常贴近,没有什么学习成本 知道redis command就会用

Transaction t = jedis.multi();
t.set("fool", "bar");
Response<String> result1 = t.get("fool"); // 这边的response 现在还是空的, 再exec后才能获取到实际的值
t.zadd("foo", 1, "barowitch");
t.zadd("foo", 0, "barinsky");
t.zadd("foo", 0, "barikoviev");
Response<Set<String>> sose = t.zrange("foo", 0, -1); // get the entire sortedset
t.exec(); // dont forget it String foolbar = result1.get(); // use Response.get() to retrieve things from a Response

使用限制

  1. 不支持事务回滚

    假设命令 a、b、c, a和b执行ok,执行到 c 的时候发生异常了,那么 a和b的操作结果是不会回滚的;

  2. 事务内多个命令间不能相互依赖

    收到 exec 后 redis-server 才开始执行,执行完毕后返回所有结果; 所以事务内多个命令之间不能有依赖,如 command-1 的返回值,不能作为下一个 command-2 的输入,因为此时获取不到结果

错误示范

Transaction t = jedis.multi();
if(t.get("key1").equals("something")) // exec之前这边是拿不到结果的
t.set("key2", "value2");
else
t.set("key", "value"); t.exec();

如果多个命令间有依赖 或者要做异常处理,并且需要原子执行,可以考虑用 script lua 脚本的方式来写

参考:

redis不完整的事务实现Transaction的更多相关文章

  1. 数据库事务(Database Transaction)概述

    事务概念 事务可以用很多很多不同的方式去定义.事务是数据库操作执行的一个逻辑工作单元,是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位.例如, 在关系数据库中, 一 ...

  2. 事务BEGIN TRANSACTION

    事务(Transaction)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.例如,银行转账工作:从一个账号扣款并使另一个账号增款,这 ...

  3. Redis(五)事务

    Redis(五)事务 引用wiki中关于事务处理的定义: Transaction processing is information processing in computer science th ...

  4. Golang 实现 Redis(8): TCC分布式事务

    本文是使用 golang 实现 redis 系列的第八篇, 将介绍如何在分布式缓存中使用 Try-Commit-Catch 方式来解决分布式一致性问题. godis 集群的源码在Github:Godi ...

  5. 华为云企业级Redis揭秘第16期:超越开源Redis的ACID"真"事务

    摘要: 开源Redis只支持伪事务,应用场景受限.高斯Redis发布企业级事务特性,支持完备ACID,为交易.库存等上层业务带来全新可能. 本文分享自华为云社区<华为云企业级Redis揭秘第16 ...

  6. sql事务(Transaction)用法介绍及回滚实例

    sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...

  7. Spring框架——批处理(batch)和事务(Transaction)

    批处理(batch) 批处理(batch)------------>好比快递员[不能一件一件的送快递] - 批处理指的是一次操作中执行多条SQL语句 - 批处理相比于一次一次执行效率会提高很多 ...

  8. 【redis专题(9)】事务

    Redis支持简单的事务,所谓简单是因为其不支持回滚(回滚是用队列模仿的),与mysql有以下区别 rollback与discard的区别: 如果已经成功执行了2条语句, 第3条语句出错 Rollba ...

  9. 事务(Transaction)

    1.演示转账的功能:(1)创建一张表示学生表表 CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50), ac ...

随机推荐

  1. 网络层协议及ARP攻击

    一:网络层介绍及ICMP协议 1,网络层 网络层位于OSI参考模型的第三层,位于传输层和数据链路层之间.向传输层提供最基本的端到端的数据传送服务.定义了基于IP协议的逻辑地址,连接不同媒介类型,选择数 ...

  2. Introduction to x265 Rate Control Algorithm

    The rate control in x265 is the same as x264's implementation, which is mostly empirical. It include ...

  3. C++基于armadillo im2col的实现

    最近学习CNN,需要用到im2col这个函数,无奈网上没有多少使用armadillo的例子,而且armadillo库中似乎也没有这个函数,因此自己写了. im2col的原理网上一大把,我懒得写了. 1 ...

  4. mysql 使用 source/mysqldump 命令导入/导出文件信息

    要导入/导出数据库信息,使用 mysql 的source命令可以方便快速的处理 以MAC为例: 一.mysqldump命令导出SQL文件 /usr/local/mysql/bin/mysqldump ...

  5. java基础——Scanner的基础和进阶

    Scanner对象 目的:用来获取用户的输入 基本语法: Scanner s = new scanner (System.in); 通过Scanner 类的next()和nextLine()方法,获取 ...

  6. git远端账号问题

    1. gitlab密码修改后git因保存密码无法下载,403 在.git/config添加如下 [credential] helper = store 添加了此项配置之后, github的账号信息就会 ...

  7. [bug] IDEA 创建springboot项目 “Initialization failed for ‘https://start.spring.io‘

    原因 网络问题,更换阿里云服务器,或自己搭建服务器 参考 https://blog.csdn.net/soulofball/article/details/107157872 https://blog ...

  8. 下载最新版本Fiddler

    下载最新版本Fiddler https://www.telerik.com/download/fiddler/fiddler-everywhere-windows

  9. [bug] mysql:Unknown system variable 'tx_isolation'

    原因: 电脑上安装mysql与jdbc驱动mysql-connector-java.jar版本不匹配 解决: 导入与mysql版本匹配的mysql-connector-java.jar即可

  10. CentOS 7系统启动后怎么从命令行模式切换到图形界面模式

    CentOS 7系统启动后怎么从命令行模式切换到图形界面模式原创传智播客官方博客 最后发布于2020-04-08 15:44:43 阅读数 88 收藏展开一.存在问题 在VMware虚拟机中成功安装c ...