Redis的事务(Redis部分支持事务)

  a)是什么

  可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞

  b)能干吗

  一个(队列)中,一次性、顺序性、排他性的执行一系列命令 

  c)怎么用

  MULTI  开始事务

  EXEC  执行事务

  DISCARD  取消事务

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

  UNWATCH  取消WATCH命令对所有key的监视

  CASE1:正常执行

    MULTI  

    命令1;命令2;命令3

    EXEC

  CASE2:放弃事务  DISCARD  

  CASE3:全体连坐

    当事务出现:如 命令出现语法错误时,命令不能正常添加到Queue中,此时事务中的所有命令都不会执行

  CASE4:冤头债主

    当事务出现:如 不是一些编译型的错误,是要在执行之后才能发现的错误,(如对string类型的数据进行incr)

  那么只有这条出错语句不会执行,事务中的其他语句不受影响,正常执行

  

  CASE5:watch监控(乐观锁的一种(检测监控))

    悲观锁:(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁

    乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,

    乐观锁策略:提交版本必须大于记录当前版本才能执行更新

  1)watch一个 key 或 多个 key,即事务开启之前,watch的 key被修改,后面开启事务对该key进行操作是会失败的

事务开启之后,watch的key被修改,这个已经开启的事务后面的命令是可以正常执行的

  关键看 multi 命令 是在修改前还是修改后执行的

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

  3)Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行

  4)通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败

  d)事务执行的三阶段 

    1.开启:以MULTI开始一个事务

    2.入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面

    3.执行:由EXEC命令触发事务 

  

  e)事务执行三特性

    单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

    没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,

也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题

    不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然有可能会被执行,没有回滚              

  

  

最新文章

  1. jquery 金额转换成大写
  2. css使absolute相对于父容器进行定位而不是以body(为什么绝对定位(absolute)的父级元素必须是相对定位(relative))
  3. iOS---A valid provisioning profile for this executable was not found
  4. spring MVC原理
  5. Memcache基本使用
  6. Tomcat 6 JNDI数据源详解
  7. bzoj1173: [Balkan2007]Point
  8. Java-数据结构与算法-逢3减1-面向对象
  9. java常用集合类:Deque,ArrayList,HashMap,HashSet
  10. 关于ionic的一些坑(1)
  11. 利用浏览器查找font-family的css编码
  12. dskinlite(uieasy mfc界面库)使用记录3:绘制动态元素(按钮控件通过隐藏方式修改图片显示)
  13. 转://Linux大内存页Oracle数据库优化
  14. GoogLeNet 解读
  15. vSphere Client的拷贝 粘帖 功能
  16. FFTW3学习笔记3:FFTW 和 CUFFT 的使用对比
  17. oracle的统计信息的查看与收集
  18. 简单理解SQL Server锁机制
  19. shelve,xml,re模块
  20. Centos 7.3 安装 Mongodb

热门文章

  1. 关于appium操作真机打开app之后无法定位页面元素的问题的解决办法
  2. Apache配置优化之开启GZip传输
  3. iOS通知注意点
  4. maven中央仓库的配置在哪里?superpom是什么?中央仓库查找三方包
  5. WordPress的Bootstrap面包屑导航
  6. Linear regression with one variable - Cost function
  7. 最新 腾讯java校招面试题(含整理过的面试题大全)
  8. GB和GIB的区别
  9. 学习笔记:oracle学习三:SQL语言基础之检索数据:简单查询、筛选查询
  10. RISC-V汇编指南