Redis的事务机制

1、redis的事务是什么

可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会被序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞(排队时后来者插到先到者前面的行为。)

也就是说,在队列中,一次性、顺序性、排他性的执行一系列命令的行为。

看看官方的介绍:

注: redis 的事务是能够使用 MULTI 命令的行为,这个命令通常会响应为 OK,在这种情况下,使用者可以进行多个命令的操作,redis会安排它们入队列而不是执行这些命令,这些所有命令在键入 EXEC 时才会被调用。

如果调用 DISCARD 命令将会刷新事务队列,而后退出事务。

2、具体的实际操作

a、 MULTI: 标记一个事务块的开始

EXEC:  执行所有事务块内的命令

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

注:图示为正常执行的情况

注:图示为放弃事务执行的情况

注: 图示中,键入 getset v2 时发生了错误,所以在最后执行时所有命令都没有执行。(类似于Java 的编译期错误。)

注:k1 为字符串,不可以进行数字操作,但是在执行了  EXEC 后才发现,后续的操作一样执行。(类似于 java 的运行期错误。)

b、WATCH: 监视一个(或者多个)key,如果在事务之前这个(或者这些)key被其他的命令所改动,那么事务将会被打断

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

注: 先设置 balance、debt 两个变量,然后再执行watch balance 和 multi 命令,在执行multi

命令之后,使用另一个终端开启另外一个客户端并改动 balance 的值后发现,exec 指令命令并不成功。(即redis事务不允许加塞。)

注: 可以看到,unwatch 可以取消对所有 key 的监控,再 watch 一下,获取最新的 key 的状态。

3、redis事务机制的三特性:

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

b、没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交之前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,事务外的查询不能够看到”的问题。

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

    附:乐观锁和悲观锁的理解

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

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

时间: 2024-10-05 22:35:36

Redis的事务机制的相关文章

redis之(九)redis的事务机制

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

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

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

redis的事务不是原子性

Reference: https://blog.csdn.net/u011692780/article/details/81213010 一.事务的四大特性 关系型数据库的事务具有四个特性: 1. 原子性 2. 一致性 3. 隔离性 4. 持久性 二.而在我们redis数据库中,事务回事什么样子的呢? 首先我们给出一个定义:redis的事务中,一次执行多条命令,本质是一组命令的集合,一个事务中所有的命令将被序列化,即按顺序执行而不会被其他命令插入 在redis中,事务的作用就是在一个队列中一次性

REDIS 事务机制

基本事务操作: 任何数据库都必须要保证一种原子执行操作:最基本的原子执行操作肯定是需要提供: 举一个例子来说明: 当对某个Key 做一个统计: 可能不同的Client做它那部分的统计,一段时间后,服务器端需要得出那个key的具体值 Client1: GET number number = number +N1; SET number number+N1; Client2: GET number number = number +N2; SET number number+N2; 原本来讲 ,期望

Redis的消息订阅及发布及事务机制

Redis的消息订阅及发布及事务机制 订阅发布 SUBSCRIBE PUBLISH 订阅消息队列及发布消息. # 首先要打开redis-cli shell窗口 一个用于消息发布 一个用于消息订阅 # SUBSCRIBE 订阅一个频道,如果频道不存在 就新增一个 # 返回参数 表示 第一个是命令 第二个是频道名称 第三个表示当前订阅该频道的数量 127.0.0.1:6379> SUBSCRIBE mychannel Reading messages... (press Ctrl-C to quit

redis事务机制

redis官方文档:Redis transactions 相关命令: DISCARD EXEC MULTI UNWATCH WATCH Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行.事务在执行期间,服务器不会中断事务而去执行其它客户端的命令请求,它会将事务中的所有命令都执行完,然后才去处理其它客户端的命令请求. 一.事务的实现 1.开启事务 通过multi命令开启事务. 2.命令入队列 之后所有的命令都会放入事务队列中,并不会立刻执行. 如果客户端发送的命令为EX

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指令的情况下,其实可以看作原子操作

第三课作业——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是有序集合