Redis(五)事务
Redis(五)事务
引用wiki中关于事务处理的定义:
Transaction processing is information processing in computer science that is divided into individual, indivisible operations called transactions. Each transaction must succeed or fail as a complete unit; it can never be only partially complete.
在计算机科学中,事务处理被分割成单个的、不可分割的操作叫做事务。事务特性是要么成功,要么失败。
Redis为什么需要事务
Redis是单线程,本身设计上保证了单个命令的执行具有线程安全。但是批命令操作,如何保证原子性?如:
- set k v;
- del k v;
这种两个命令的操作,需要原子性:要么全部被执行成功,要么全部执行失败。
Redis的事务特性
在Redis中事务需要保证两点:
- 原子性:要么全部执行要么全部不执行,主要通过multi和exec保证;
- 隔离性:批命令的执行中,不可再插入其他客户端请求的命令的执行;
Redis事务和DB事务的区别
原子性上的差异,DB事务中原子性保证要么全部被执行成功要么全部不执行(回滚)。Redis中的原子性表明要么全部被执行(有些命令可能会执行失败,执行失败并不回滚,后续会介绍)要么全部不执行。
DB事务的需要保证ACID特性,在事务的要求上更加的苛刻严格。Redis的事务特性只需要遵循以上两点特征。
对于Redis和DB事务的隔离性有很大差异,切勿弄混。Redis的隔离性是指事务操作中不可有其他的客户端命令的执行,而DB事务的隔离性更多是在数据可见性上的保证。
Redis事务是不支持回滚的。Redis认为操作失败只会因为命令语法导致错误,这种情况下,应该是开发测试中予以解决。还有回滚必然会影响Redis的性能。
如下:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k v
QUEUED
127.0.0.1:6379> set m n
QUEUED
127.0.0.1:6379> set x y
QUEUED
127.0.0.1:6379> lpush x i e
QUEUED
127.0.0.1:6379> hset k key value
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
4) (error) WRONGTYPE Operation against a key holding the wrong kind of value
5) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get k
"v"
127.0.0.1:6379> get x
"y"
127.0.0.1:6379>
前三个set命令都执行成功,但是后续的lpush、hset因为操作的key类型不对,全部失败,但是事务并没有回滚。但是Redis保证了事务的原子性——全部执行。
Redis对事务的支持
Redis主要是通过multi/exec/discard/watch几个命令操作实现对事务的支持的。
- multi开启一个事务
- exec执行提交事务
- discard废弃事务
- watch监视键值
原理:在Redis中通过维护队列的方式实现事务,将事务中批操作全部按顺序入队,在exec时,再批量执行。
错误处理:不同Redis版本在入队时遇到异常的处理情况是不一样的。Redis 2.6.5以后是入队前检查操作的正确性(如命令的参数数量错误),如果有错误,将返回错误响应,同时会将错误的命令操作记录,在执行exec时,判断是否有错误记录,如果有,放弃事务执行。这样方便流水线pipeline操作,减少client和redis server的通信。
exec执行时遇到的错误(如操作命令如key不符),redis的处理方式是忽略执行错误的操作,继续处理后续操作。上面原理介绍到multi开始事务,后续命令都会入队。所以只要将队列情况就可以废弃当前事务。
在DB中为了保证数据的一致性时,通常都是提供锁操作,比如Mysql中update时会有排它锁。但是Redis中并不是这样,因为排它锁属于悲观锁的一种,会对性能大打折扣。Redis提供了乐观锁机制给应用保证数据的一致性。
watch操作:Redis在开启事务之前,可以对事务中修改的key进行watch监视,在事务exec时,如果key在之前被其他的客户端修改,那么将放弃此次事务。watch可以在事务开始之前被调用多次,也可以一次调用监视多个key。
乐观锁的机制在java中的提现就是cas操作。关于乐观锁,后面会开相关的文章。
Redis中的另一种事务支持
在Redis2.6以后的版本中,除了以上的方式对事务的支持,Redis引入的Lua脚本方式也可以用于事务场景。在Redis中脚本的执行更加的简单和快速。
持久化对Redis事务的影响
当使用AOF方式持久化时,Redis会使用单个的write命令进行系统调用将事务写入磁盘。
参考
Redis(五)事务的更多相关文章
- Redis笔记(五)Redis的事务
>>关系型数据库的事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消. Atomic(原子性): 一个事务(transaction)中的 ...
- Redis的事务功能详解
Redis的事务功能详解 MULTI.EXEC.DISCARD和WATCH命令是Redis事务功能的基础.Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: >Re ...
- Redis保证事务一致性,以及常用的数据结构
reids命令可以参考中文官网:http://redis.cn/commands.html 关于reids的使用,可以封装到工具类进行调用: Redis的工具类:JedisAdapter 除了数据结构 ...
- redis五种数据类型的使用场景
string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
- Redis学习八:Redis的事务
一.是什么 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 二.能干嘛 一个队列中,一次性.顺序性.排他性的执行一系列命 ...
- redis(4)事务
一.事务 一般来说,事务必须满足4个条件,也就是我们常说的ACID: 1)Atomicity 原子性:一个事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间的某个环节.事务在执行过程中发生错 ...
- redis之(九)redis的事务机制
[一]什么是redis的事务 --->redis的事务是一组命令的集合. --->redis的事务是保证一组命令,要么都执行,要么都不执行.但不支持一组命令中,其中一个或多个执行失败,不支 ...
- 什么是Redis的事务
一.什么是Redis的事务 可以一次执行多个命令,本质上是一组命令的集合.一个事务中的所有命令都会序列化,然后按顺序地串行化执行,而不会被插入其它命令. 二.Redis的事务可以做什么 一个队列中,一 ...
- 【Redis】事务 (超详细)
一.概述 二.相关命令列表 2.1 MULTI 2.2 EXEC 2.3 DISCARD 2.4 WATCH key [key ...] 2.5 UNWATCH 三.命令示例 3.1 事务被正常执行 ...
- Redis五种数据结构简介
Redis五种结构 1.String 可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作. 字符 ...
随机推荐
- LNMP环境下搭建SVN服务
最近自己买了个服务器,试着在上面搭建了LNMP环境,因为以前在本地用MAMP Pro搭建过LAMP环境,所以基本上还算是轻车熟路,第一次搭建LNMP,使用的是一键安装,过程是顺利的,后来在使用过程中遇 ...
- 【原】通过Spring结合Cglib处理非接口代理
前言: 之前做的一个项目,虽然是查询ES,但内部有大量的逻辑计算,非常耗时,而且经常收到JVM峰值告警邮件.分析了一下基础数据每天凌晨更新一次,但查询和计算其实在第一次之后就可以写入缓存,这样后面直接 ...
- [转]技术比较Agent和Agentless监控优缺点
本文并非原创,转自:http://wenku.baidu.com/link?url=NGT2NA7Lf6fZSPmcOxFQqL4cYROHlIOJyiWCnGdwv3kljMqub-6zyjgsSw ...
- day02 整理
目录 编程语言的分类 机器语言 汇编语言 高级语言 编译型语言(谷歌翻译) 解释型语言(同声传译) 执行python程序的两种方式 Jupyter的使用 jupyter的介绍 安装 基本使用 Jupy ...
- LearnOpenGL.PBR.理论
判断一种PBR光照模型是否是基于物理的,必须满足以下三个条件: ()基于微平面(Microfacet)的表面模型.Be based on the microfacet surface model. ( ...
- Ubuntu18.04.2下安装 RTX2080 Nvidia显卡驱动
转载请注明出处:BooTurbo https://www.cnblogs.com/booturbo/p/11261903.html 不久前入手了蓝天P870TM1G准系统,配置如下: 1. Z370 ...
- 201871020225-牟星源《面向对象程序设计(java)》第十三周学习总结
201871020225-牟星源<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- day13_7.15 迭代器和生成器
1.迭代器 迭代就是一个更新换代的过程,每次迭代都必须基于上一次的结果. 迭代器就是迭代取值的工具.举个例子: while True: print('循环输出') 此代码会无限循环输出文字,是个死循环 ...
- 洛谷 P1950 长方形_NOI导刊2009提高(2)
传送门 思路 首先定义\(h\)数组,\(h[i][j]\)表示第\(i\)行第\(j\)列最多可以向上延伸多长(直到一个被用过的格子) 然后使用单调栈算出 \(l_i\)和 \(r_i\) ,分别是 ...
- [LeetCode] 26. Remove Duplicates from Sorted Array 有序数组中去除重复项
Given a sorted array nums, remove the duplicates in-place such that each element appear only once an ...