跟我一起学Redis之Redis事务简单了解一下

前言

关系数据库中的事务,小伙伴们应该是不陌生了,不管是在开发还是在面试过程中,总有两个问题逃不掉:

•说说事务的特性;•事务隔离级别是怎么一回事?

事务处理不好,数据就可能不准确,最终就会导致业务出问题;借此机会简单回顾一下事务特性及其隔离级别,就当是复习了;

事务特性(ACID)

•原子性(Atomicity)指事务内所有操作要么一起执行成功,要么都一起失败(或者说是回滚);如事务经典转账案例:A给B转账,A把钱扣了,但B没有收到;可见这种错误是不能接受的,最终会回滚,这也是原子性的重要性。•一致性(Consistency)指事务执行前后的状态一致,如事务经典转账案例:A给B互相转账,不管怎么转,最终两者钱的总和还是不变;•持久性(Durability)指事务一旦提交,数据就已经永久保存了,不能再回滚;•隔离性(Isolation)指多个并发事务之间的操作互不干扰,但是事务的并发可能会导致数据脏读、不可重复读、幻读问题,根据业务情况,采用事务隔离级别进行对应数据读问题处理。

事务隔离级别

•读未提交(Read uncommitted)指一个事务读取到其他未提交事务的数据。可能导致数据脏读。转账案例:A正在给B转账,本来转的1000,A多输入了个0,变成10000,但此事务还未提交,但此时B查询到转入的是10000,但A取消事务回滚之后,B又查询不到转入的数据。这种情况就是脏读•读已提交(Read committed)指一个事务只能读取到其他事务已提交的数据,从而解决了脏读的问题。但可能导致数据不可重复读;转账案例:A要给B转账1000,A先查看了一下余额,有1000,然后开始给B转钱,但此时A家里电费通过开启的自动缴费功能,自动从A账户扣除200缴纳电费,并提交;当A转账准备提交,再次确认余额时,钱少了200。这样就导致同一个事务中多次查询的结果不一致,这种情况就是不可重复读;•可重复读(Repeatable read)指事务只要一开启,就不允许其他事务进行修改操作,从而解决了不可重复读问题。但可能导致数据幻读;转账案例:A经常给B转账,到年底了,需要查账,然后开启了一个事务进行查询统计,刚开始查询只是10条转账记录,正准备统计时,因为紧急情况A需要给B转一笔钱应急,从而新增了一条新记录,并提交;而查账事务正在统计中,最后发现转账额和看到的10条转账记录不匹配。这种情况就是幻读•序列化(Serializable )指事务之间只能串行话执行,就像队列一样,排队进行,这样就解决了幻读的问题,但是这种级别的并发性能不高,非特殊需求,这种级别一般不用。

正文

转入正题,结合关系型数据库的事务来看看Redis中事务有什么不同;

Redis事务是指将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事务执行过程中不会受客户端传入的命令请求影响。

Redis事务的相关命令如下:

•MULTI:标识一个事务的开启,即开启事务;•EXEC:执行事务中的所有命令,即提交;•DISCARD:放弃事务;和回滚不一样,Redis事务不支持回滚。•WATCH:监视Key改变,用于实现乐观锁。如果监视的Key的值改变,事务最终会执行失败。•UNWATCH:放弃监视。

Redis事务和关系型数据库的事务不太一样,它不保证原子性,也没有隔离级别的概念。来,结合命令演示,实战说明一切:

没有隔离级别

image-20201112153132140

如上图所示,当事务开启时,事务期间的命令并没有执行,而是加入队列,只有执行EXEC命令时,事务中的命令才会按照顺序一一执行,从而事务间就不会导致数据脏读、不可重复读、幻读的问题,因此就没有隔离级别

不保证原子性

image-20201112154524168

如上图所示,在通过EXEC执行事务时,其中命令执行失败不会影响到其他命令的执行,并没有保证同时成功和同时失败的原子操作,尽管这样,Redis事务中也没有提供回滚的支持,官方提供了两个理由:

image-20201112160255544

大概的意思就是:

•使用Redis命令语法错误,或是将命令运用在错误的数据类型键上(如对字符串进行加减乘除等),从而导致业务数据有问题,这种情况认为是编程导致的错误,应该在开发过程中解决,避免在生产环境中发生;•由于不用支持回滚功能,Redis内部简单化,而且还比较快;

在事务命令入队过程中,发现相关命令逻辑使用错误,可以进行放弃该事务;如果使用错误的Redis命令,且没有放弃事务,最终也会导致事务整体执行失败,这也算是为原子性扳回一局,如下:

放弃事务

image-20201112223050653

命令语法错误导致事务执行失败

image-20201112223821761

使用WATCH实现乐观锁

说到乐观锁,就和悲观锁一起简单说说对其的理解:

乐观锁:就是非常乐观,做什么事都往好处想;对于数据库操作,就认为每次操作数据的时候都认为别的操作不会修改,所以不会加锁,而是通过一个类似于版本的字段来标识该数据是否修改过,在执行本次操作前先判断是否修改过,如果修改过就放弃本次操作重新再来;

悲观锁:就是非常悲观,做什么事都觉得不好;对于数据库操作,每次操作数据数据都会认为别的操作会修改当前数据,所以都要对其进行加锁,类似于表锁和行锁。

WATCH通过监视指定Redis Key,如果没有改变,就执行成功,如果发现对应值发生改变,事务就会执行失败,如下图;

image-20201112232612965

那会一直监视指定的Key吗?,答案当然是不会的,以下三种方式可以取消监视:

•事务执行之后,不管是否执行成功还好是失败,都会取消对应的监视;•当监视的客户端断开连接时,也会取消监视;•可以手动UNWATCH取消所有Key的监视;

Redis事务优缺点

优点

•一次性按顺序执行多个Redis命令,不受其他客户端命令请求影响;•事务中的命令要么都执行(命令间执行失败互相不影响),要么都不执行(比如中间有命令语法错误);

缺点

•事务执行时,不能保证原子性;•命令入队每次都需要和服务器进行交互,增加带宽;

注意

•当事务中命令语法使用错误时,最终会导致事务执行不成功,即事务内所有命令都不执行;•当事务中命令知识逻辑错误,就比如给字符串做加减乘除操作时,只能在执行过程中发现错误,这种事务执行中失败的命令不影响其他命令的执行。

总结

对于Redis事务,其实用的不是很多,大部分喜欢使用Lua脚本进行批量命令的执行,同时还能保证命令执行的原子性。

那为什么要说Redis事务呢?

在之前计划写这篇文章的时候,和一些朋友简单沟通过,大家的确用的不多,基本上都是用Lua脚本;但面试会时不时遇到过Redis事务的问题,最常见的是Redis中的事务和关系型数据库中的事务有什么区别,这是从面试角度出发有这篇文章;

其实Redis 2.6版本之前,还不支持Lua脚本时,Redis事务对于批量按序执行命令的场景也是很用的;就拿当下来说,如果一些业务需批量按序执行命令的,同样可以使用,并非一定要Lua脚本。这是从使用角度来说;

最后从学习角度来说,既然学Redis,就应该尽可能的了解的多一点。下一篇说说持久化。

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

groovy 字符串截取最后一个_Python入门高级教程--Python 字符串

Python 字符串字符串是 Python 中最常用的数据类型。我们可以使用引号(或")来创建字符串。创建字符串很简单,只要为变量分配一个值即可。例如:var1 Hello World!var2 "Python Runoob"Python 访问字符串中的值Python 不支持单字符类型&a…

java面试题_阿里大厂流出的数百道 Java 经典面试题

BAT 常问的 Java基础39道常见面试题1.八种基本数据类型的大小,以及他们的封装类2.引用数据类型3.Switch能否用string做参数4.equals与的区别5.自动装箱,常量池6.Object有哪些公用方法7.Java的四种引用,强弱软虚,用到的场景8.Hashc…

​被冷落的运算符重载

基本类型可以使用运算符进行运算、比较、取反等操作。如果想使用运算符操作两个对象,我们就需要用到运算符重载。我们先看个例子,假如有个房子类,有长和宽两个属性。代码如下:接下来我们使用House类实例化两个对象:hou…

neo4j 查询同一节点的两个上级_WhatRoute for Mac(互联网流量诊断查询工具)

如果您想在不使用命令行的情况下执行流量诊断查询,那么WhatRoute是一个不错的选择。WhatRoute提供了一个干净且有条理的界面,主要提供Traceroute功能,但也可以执行Ping,域名服务查询,Whois查询以及监控进出计算机的流量…

快来参加学习.NET 挑战赛

今天访问dot.net 网站看到了一个学习.NET 挑战赛,发现已经赛程过半了,这是一个为那些想更多地了解 C# 和 .NET 的人举办的一个完全免费的课程活动,这些模块必须在 11 月底前完成。参加这个挑战赛,你必须从 .NET 学习挑战页面进入进…

excel怎么设置打印区域_别再浪费打印纸了!这样设置,Excel表格再大都能打印成一页!...

在打印Excel表格时,你是不是经常碰到过这种情况:明明排版好的表格,结果打印完却发现只显示一半......表格太宽导致无法打印在A4纸上......今天叨叨君就来分享几个有效的解决方法,教你轻轻松松将表格打印在一页纸上,一起…

xcode 修改 infodictionary_安卓系统修改复位键生效时间

文档说明本文档以SC806-CN-00(msm8909平台,Android 7)为例,说明如何修改复位键生效时间。应用背景默认情况下,按复位键,系统马上直接关机。在实际应用中,有可能由于干扰造成的抖动导致误关机行为。 为避免发生这种情况…

为什么曾经优秀的人突然变得平庸?

职场&认知洞察 丨 作者 / findyi这是findyi公众号分享的第95篇原创文章一个读者的提问:洋哥,我从小都是学霸,本硕都是985,计算机科班出身,但进入职场后却始终无法取得突破。工作5年还是基层员工,我该怎…

java编程_Java编程和C语言的比较

很多人都拿Java编程和c语言相比较,那么今天小编就来先说说个人理解吧,新手学习Java很简单,上手也很容易,只需要会拼音就可以,简单而且没有门槛,而c语言学习成本高,更需要投入较大的精力&#xf…

.NET Core3.1升级.NET5,坑还真不少...

11月11号是电商狂欢的日子,也是.NET5正式发布的日子,媳妇儿等着零点秒杀,我却在刷新着微软官网等更新,然后第一时间开始折腾。此前Scott Hunter在博客信誓旦旦.NET Core3.1平滑迁移.NET5,于是当天就去升级我的宝藏项目…

requestPermissions读写手机存储权限_泛圈云盘可为企业建立高效安全的云办公在线协同文档存储?...

泛圈企业云盘结合智能手机和无线网络,实现对任何办公地点和办公时间的无缝访问,提高办公效率。它可以连接客户原有的各种IT系统,包括OA、邮件、ERP等各种个人业务系统,使手机也可以用来操作、浏览、管理公司的所有工作事务&#x…

怎么将SVG转成PNG(.NET工具包编写)

序一天,作者在深圳湾吹风时突然想到自己还有 20 多位粉丝,所以决定每周至少要水一篇文章。众所周知,一篇文章要有封面,正痛苦时,.NET 官方网站更新了一大波质量上乘的插图;高兴之余,发觉平台不支…

ghelper怎么在手机上用_当长时间不用手机玩《崩坏3》、《战双》

崩坏3、战双,虽然是手机游戏,作为一个PC党,我还是热衷于用电脑玩游戏。用电脑玩游戏可以把画质全部开到最大,依旧可以顺畅地进行游戏。手机就不行,即使是苹果,把画质拉满,依旧会有卡顿。特别是崩…

System.Text.Json中时间格式化

转自:Rayomcnblogs.com/Rayom/p/13967415.html简介.Net Core 3.0开始全新推出了一个名为System.Text.Json的Json解析库,用于序列化和反序列化Json,此库的设计是为了取代Json.Net(Newtonsoft.Json)时间格式化的不足System.Text.Json的优点就不…

windows server 启用 vss_windows服务器常用的安全加固方法

Windows操作系统本身已经提供了多种安全机制,如标识与鉴别、访问控制、用户账户控制、安全审计、文件系统。但是,这并不意味着操作系统就固若金汤。事实上,任何一个Windows版本都或多或少的存在着漏洞,而且在不断的被挖掘出来。Wi…

说说 C# 9 新特性的实际运用

前言你一定会好奇:“老周,你去哪开飞机了?这么久没写博客了。”老周:“我买不起飞机,开了个铁矿,挖了一年半的石头。谁知铁矿垮了,压死了几条蜈蚣,什么也没挖着。”所以,…

thinkpad笔记本散热风扇_十代酷睿笔记本低至2999元 你可以入手了_笔记本新闻

这年头3000元能干什么?买一套化妆品还是一套乐高积木?现在很严肃地告诉你,可以买一台笔记本,而且是搭载英特尔第十代酷睿处理器的轻薄笔记本——联想ThinkPad 翼14 Slim。联想ThinkPad 翼14 Slim轻薄笔记本其搭载了英特尔十代酷睿…

BenchmarkDotNet v0.12x新增功能

起因在看.Net 官方博客 .Net 5性能优化 中,发现测试性能的BenchmarkDotNet版本已经是v0.12.1,然后去看BenchmarkDotNet文档,发现还是有不少新的特性.v0.12.0支持多个运行时(API改进),增加对.Net 5支持支持DotNet创建BenchmarkDotNet项目(项目模版)增加NativeMemoryProfiler(目前…

centos amd双显卡_PCIe4.0和PCIe3.0对显卡性能差别大吗?

众所周知,AMD X570、B550主板,包括RX3000系列显卡,率先支持了PCIe 4.0协议,高达32GB/s带宽,相比现在的PCIe3.0带宽足足翻了一倍,也是AMD新平台一大卖点,然而intel却无动于衷,并各种表…

我画着图,FluentAPI 她自己就生成了

在 Newbe.ObjectVistor 0.3 版本中我们非常兴奋的引入了一个紧张刺激的新特性:使用状态图来生成任意给定的 FluentAPI 设计。开篇摘要 在非常多优秀的框架中都存在一部分 FluentAPI 的设计。这种 API 设计更加符合人类自言语言描述。使得代码更加具备可读性。在 New…