你问我Redis支不支持事物?告诉你,Redis对事物的支持是部分支持(对比关系型数据库,没有强一致性)

定义:一个队列、一次性、顺序的、排他性的执行一系列命令

常用命令:

  DISCARD  取消事物,放弃执行事物块内的所有命令

  EXEC  执行事物块内的所有命令

  MULTI  标记一个事物块的开始

  UNWATCH  取消watch命令对所有key的监控

  WATCH  监控一个或多个key,如果在事物执行之前,key被其他命令改动,那么事物将被打断

Case1:正常执行

   

Case2:放弃事物

  

  我们可以发现,k1还是Case1中设置的值

Case3:全体连坐(一个捣蛋,全体都死)

  

Case4:冤头债主(错误的不执行,正确的照常执行)

  

  k1位字符型,增加1显然不行,但是语法没错(加入了队列,不像Case3中的直接报错)。执行EXEC时,出现错误的语句块不会执行成功,但不影响事物块中其他的命令执行

Case5:watch监控

  ⑴ 第一步:(balance 可用余额,debt:欠款),假设我买了个包子20块刷了我的信用卡,可用余额减20,欠款加20

  

  ⑵ 第二步(当第一个窗口watch[监控]balance的后,在第二个窗口将balance设置成了1000块,然后我在第一个窗口又买了个包子花了20块,执行事物发现,并没有成功,获得最新的balance为1000):

  

  上面这部类似于数据库中的乐观锁,当我们修改一条记录的时候,别人也在试图修改这条记录,当别人先于我之前就提交了,那么我提交的时候,就不能覆盖别人提交的数据,所以rollback了。

  ⑶ 第三步(第一个窗口watch[监控]我的余额后,在第二个窗口修改余额,假设此时我知道有人改了我的余额,那我在第一个窗口Unwatch一下,然后再watch下,设置我的余额为100,欠款为0,执行成功):

  

  小结:WATCH监控一个或多个key,如果在事物执行之前,key被其他命令改动,那么事物将被打断(事物队列都不会被执行)

       一旦执行了exec,之前加的监控锁都会被取消

          如果是watch多个key,倘若watch之后有人改动过其中的key,exec执行的事物将都被放弃,同时返回NullMulti-bulk应答以通知调用者事物执行失败

  

Redis之Transactions(事物)的更多相关文章

  1. Springboot与ActiveMQ、Solr、Redis中分布式事物的初步探索

    Springboot与ActiveMQ.Solr.Redis中分布式事物的初步探索 解决的场景:事物中的异步问题,当要求数据库与solr服务器的最终一致时. 程序条件: 利用消息队列,当数据库添加成功 ...

  2. Redis集群事物提交异常Multi-key operations must involve a single slot

    redis做完集群后不同键在同一事物中提交,因为key的hash计算结果不同不能分配到同一个分片上,因此出现此异常. 解决方案:在本次事物的key内添加"{tag}",这时redi ...

  3. Redis 命令 - Transactions

    DISCARD Discard all commands issued after MULTI 127.0.0.1:6379> MGET bank:A:account bank:B:accoun ...

  4. Redis常用数据类型和事物以及并发

    Redis数据类型 基本类型(String int): 如 set key value .get key 等 所有命令都是按照 key value keys * 可以将全部数据列出,其中后面的 &qu ...

  5. Redis事物及锁的运用

    redis与mysql事物比较如下: 下面是一个redis事物运用于买票的demo

  6. Redis应用场景-转载

    1.  MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的 ...

  7. Redis学习笔记--五种数据类型的使用场景

    String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  8. Redis基础知识之—— 缓存应用场景

    转载原文:http://www.cnblogs.com/jinshengzhi/articles/5225718.html 一.MySql+Memcached架构的问题 Memcached采用客户端- ...

  9. <转>Redis 应用场景

    http://blog.csdn.net/hguisu/article/details/8836819 1.  MySql+Memcached 架构的问题 Memcached采用客户端-服务器的架构, ...

随机推荐

  1. LOJ2116 [HNOI2015] 开店 【点分治】

    题目分析: 观察题目发现度数不小于三,考虑从边分治入手,用点分治代替.将树划分成重心链接的结构,称为点分树.令当前询问的点为$ u $.那么我们考虑点分树的根到$ u $的一条路径.考虑根结点,排除掉 ...

  2. POJ 3667 Hotel(算竞进阶习题)

    线段树区间染色 题目要求最大的连续段的左端点,我们在查询的时候返回最左端即可,注意查找顺序,应该从左到右!! 另外这类染色的push_down其实比较简单,直接染成上一层的标记即可 push_up和连 ...

  3. 如何让自己定义的memory使用fpga自带的memory资源

    前言 本文解决方法来源: http://quartushelp.altera.com/13.1/mergedProjects/hdl/vlog/vlog_file_dir_ram.htm 如果你自己V ...

  4. 「BZOJ1251」序列终结者 (splay 区间操作)

    题面: 1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 5367  Solved: 2323[Submit][Status][D ...

  5. Windows如何使用bin文件下的命令

    开发人员安装了一些软件,例如git.maven.gradle等,需要用到对应的bin文件夹下的相应的命令. 如果直接使用,会报错“不是内部或外部命令,也不是可运行的程序或批处理文件” 一.这时往往会配 ...

  6. Educational Codeforces Round 54 [Rated for Div. 2] (CF1076)

    第一次在宿舍打CF 把同宿舍的妹子吵得不行... 特此抱歉QAQ A 题意:给定一个字符串, 最多删掉一个字符,使得剩余字符串字典序最小 n<=2e5 当然"最多"是假的 删 ...

  7. Educational Codeforces Round 51 (Rated for Div. 2) G. Distinctification(线段树合并 + 并查集)

    题意 给出一个长度为 \(n\) 序列 , 每个位置有 \(a_i , b_i\) 两个参数 , \(b_i\) 互不相同 ,你可以进行任意次如下的两种操作 : 若存在 \(j \not = i\) ...

  8. Android热点回顾第一期

    本文由 ImportNew - 陈强 翻译自 androidweekly.如需转载本文,请先参见文章末尾处的转载要求. Importnew注:欢迎Android爱好者参与翻译文中提及的教程,请私信联系 ...

  9. notepad++设置(不断更新)

    1.主题设置 主题名称:Obsidian 字体字号:Courier New 10 设置方法: 设置---语言格式设置---选择主题,同时勾选“使用全局字体”“使用全局字体大小 补充一点: 修改两处地方 ...

  10. 「TJOI2015」组合数学 解题报告

    「TJOI2015」组合数学 这不是个贪心吗? 怎么都最小链覆盖=最大点独立集去了 注意到一个点出度最多只有2,可以贪心一下出度的去向 按读入顺序处理就可以,维护一个\(res_i\)数组,表示上一行 ...