6.Redis的事务

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同一个事务中如果有一条命令执行失败,其后的命令仍然有可能会被执行,没有回滚              

  

  

时间: 2024-08-27 04:42:43

6.Redis的事务的相关文章

Redis的事务机制

1.redis的事务是什么 可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会被序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞(排队时后来者插到先到者前面的行为.) 也就是说,在队列中,一次性.顺序性.排他性的执行一系列命令的行为. 看看官方的介绍: 注: redis 的事务是能够使用 MULTI 命令的行为,这个命令通常会响应为 OK,在这种情况下,使用者可以进行多个命令的操作,redis会安排它们入队列而不是执行这些命令,这些所有命令在键入 EXEC 时才会被调用

Redis的事务

Redis对事务的支持是部分支持,不想oracle,要么都成功要么都失败,Redis可以部分成功部分失败 1 是什么: 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞 2 能干嘛: 一个队列中,一次性.顺序性.排他性的执行一系列命令 3 怎么玩 Redis 事务命令 下标列出了redis事务的相关命令 1. DISCARD 取消事务,放弃执行事务块内的所有命令. 2. EXEC 执行所有事务块内的命令 3. MULTI

WINDOWS 下, Redis 单机事务测试

WIN 10: i5 4440, 8GB 测试REDIS的事务速度 REDIS的WATCH机制实现事务是一个乐观锁形式(应该是SPIN LOCK的一种).适用于并发度不是很高的场景,可以节约CPU资源(轻量级锁).但是当竞争激烈的情况下,失败概率会大大提升,大量失败后的重试会耗费CPU资源. 测试的逻辑 1)读取计数器 2)JAVA端自增 3)设置回REDIS 此处不可用REDIS自带的incr函数,REDIS服务器端为单线程执行,所以服务器端只执行一个incr指令的情况下,其实可以看作原子操作

node.js redis对事务的控制

redis对事务的支持还是比较差的,就是把所有的执行命令方到队列中一个一个执行 multi开启一个事务,exec执行事务集合中的命令 代码: var redisClient; redisClient.multi([        ["set", "ttt_1", "1111111"],        ["incr", "ttt_2"],        ["incr", "ttt

第三课作业——set类型、sorted set类型的增删改查,redis的事务

第三课时作业 静哥 by 2016.2.23~2016.3.6   [作业描述] 1.总结什么是set以及什么是sorted set,并完成对set以及sorted set的增删改查(查需要至少4种方式,比如列表,单个节点等) 2.总结redis的事务特征,并且实际操作事务的提交  丢弃以及乐观锁 [作业一:总结什么是set以及什么是sorted set,并完成对set以及sorted set的增删改查] (1) set是字符串的无序集合,集合内的成员可以是重复: sorted set是有序集合

redis之(九)redis的事务机制

[一]什么是redis的事务 --->redis的事务是一组命令的集合. --->redis的事务是保证一组命令,要么都执行,要么都不执行.但不支持一组命令中,其中一个或多个执行失败,不支持数据回滚.数据的一致性,由程序员控制. --->redis的事务还能保证一个事务内的命令依次执行,而不被其他命令插入.试想,客户端 A发送几条命令到redis服务器,客户端B也送了一条命令也到redis服务器上.如果不使用事务,则客户端 B的那条命令就有可能在客户端A的那几条命令中间执行. [二]re

Redis的事务和watch

redis的事务 严格意义来讲,redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的. redis中的事务定义 Redis中的事务(transaction)是一组命令的集合. 事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令. Redis保证一个事务中的所有命令要么都执行,要么都不执行.如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务

【Redis源码剖析】 - Redis之事务的实现原理

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51262268 今天为大家带来Redis中事务部分的源码分析.Redis的事务机制允许将多个命令当做一个独立的单元运行,主要包括multi.exec.watch.unwatch.discard五个相关命令.如果你还不熟悉这几个命令,可以先看看我的另一篇文章[Redis学习笔记(七)] Redis中的事务 本文所讲述的内容主要涉及redis.h和multi.c两个源文件,依据惯例,

Redis的事务功能详解

Redis的事务功能详解 MULTI.EXEC.DISCARD和WATCH命令是Redis事务功能的基础.Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: >Redis会将一个事务中的所有命令序列化,然后按顺序执行.Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求.这样便能保证Redis将这些命令作为一个单独的隔离操作执行. > 在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行.因此,Redis事务能够保证