为何Redis用乐观锁,而MySQL数据库却没有
2021-08-06 0
简单来说,Redis使用乐观锁,相对于悲观锁,在实现中更加简单,在某些场景中的性能也更好。Redis作为一个轻量级的、快速的缓存引擎,而不是一个全功能的关系型数据库,既没有使用悲观锁的必要,也难以承受使用悲观锁的成本。
详细来说,要深入到Redis和MySQL的事务处理机制。Redis关于事务的文档见此:
Transactions(事务)
Redis对于事务只提供了非常有限的支持,其实更多地是试图绕过问题。
首先,Redis对于同一事务中的一组操作,而不是立即执行,而是放入一个queue中,当执行到EXEC时,再一起执行。事务执行是全局独占的,也就是同一时间只有一个事务被执行,中途不能被其它事务打断。Redis用这种最简单的、也是性能最差的方式避免了race
condition。
其次,在Redis的事务中,如果有一个或多个操作失败,其它操作仍然会成功,也就是说它根本没有回滚机制。
这种方式会带来很多严重的问题,其中之一是,无法先读取某个数值后再进行依赖这个值的操作,因为放在一个事务里会被在同一个瞬间执行,不放在同一个事务里又会导致race
condition。解决方法是使用WATCH,它会监视一个或多个变量,如果变量的值在调用WATCH以后和事务提交之前被别的事务修改过了,整个事务都会失败。这类似于操作系统中的CAS(Compare
and
Set)。我不知道WATCH具体是怎么实现的,但是我推测它监控了指定变量的版本号。
即使有了WATCH,Redis的事务也是受到严重限制的。第一,它没有实现读数据时的一致性,因为WATCH对于读操作不起作用。第二,它不支持回滚。第三,在对同一变量存在大量并发写操作时,性能会非常差,因为每次提交事务时,WATCH监控的变量都已经被修改了,导致事务将多次提交失败。但是,Redis本来就是一个KV类型的缓存引擎,要处理的是大量读少量写的场景,对一致性也没有要求。
MySQL就完全不一样了,作为一个典型的关系型数据库,它需要完整地实现ACID,所以Redis的方式是解决不了它的问题的。
MySQL中的MVCC机制(Oracle的也是),通过undo
日志来获取某个行记录的历史快照,从而实现了所谓的读一致性。它的目的是读取某个时间点上的历史数据(而不是可能已经被修改了的数据),而不是避免悲观锁的使用。严格地说这不能称之为乐观锁,因为它既不Compare当前版本和历史版本,也不进行Set。事实上,在读取记录的历史快照时,当前记录有可能(由于并发的写操作)已经被加上独占锁。
进一步的问题是:有没有可能使用乐观锁来实现RDBMS中的写一致性?有没有可能使用乐观锁实现完整的ACID特性?
回答是可以。例如,MS
SQL
SERVER的Hekaton引擎通过一套基于时间戳的多版本管理系统,实现了不使用了悲观锁的ACID。
但是,这并不意味着乐观锁必然优于悲观锁。除了维护多版本的开销以外,乐观锁无法避免的一个问题是,当多个写操作试图更新同一个对象时,只有第一个操作可以成功,其它的操作都会在Compare时失败然后回滚,从而造成极大的性能问题。在这种情况下,乐观锁的性能会低于悲观锁。
目前的趋势似乎是,大规模的分布式数据库更倾向于使用乐观锁来达到所谓的external
consistency,因为基于传统悲观锁的分布式锁在集群大到一定程度以后(从几百台扩展到成千上万台时),性能开销就大得无法接受了。Google的Spanner就是基于乐观锁。当然这完全是另外一个问题了。
详细来说,要深入到Redis和MySQL的事务处理机制。Redis关于事务的文档见此:
Transactions(事务)
Redis对于事务只提供了非常有限的支持,其实更多地是试图绕过问题。
首先,Redis对于同一事务中的一组操作,而不是立即执行,而是放入一个queue中,当执行到EXEC时,再一起执行。事务执行是全局独占的,也就是同一时间只有一个事务被执行,中途不能被其它事务打断。Redis用这种最简单的、也是性能最差的方式避免了race
condition。
其次,在Redis的事务中,如果有一个或多个操作失败,其它操作仍然会成功,也就是说它根本没有回滚机制。
这种方式会带来很多严重的问题,其中之一是,无法先读取某个数值后再进行依赖这个值的操作,因为放在一个事务里会被在同一个瞬间执行,不放在同一个事务里又会导致race
condition。解决方法是使用WATCH,它会监视一个或多个变量,如果变量的值在调用WATCH以后和事务提交之前被别的事务修改过了,整个事务都会失败。这类似于操作系统中的CAS(Compare
and
Set)。我不知道WATCH具体是怎么实现的,但是我推测它监控了指定变量的版本号。
即使有了WATCH,Redis的事务也是受到严重限制的。第一,它没有实现读数据时的一致性,因为WATCH对于读操作不起作用。第二,它不支持回滚。第三,在对同一变量存在大量并发写操作时,性能会非常差,因为每次提交事务时,WATCH监控的变量都已经被修改了,导致事务将多次提交失败。但是,Redis本来就是一个KV类型的缓存引擎,要处理的是大量读少量写的场景,对一致性也没有要求。
MySQL就完全不一样了,作为一个典型的关系型数据库,它需要完整地实现ACID,所以Redis的方式是解决不了它的问题的。
MySQL中的MVCC机制(Oracle的也是),通过undo
日志来获取某个行记录的历史快照,从而实现了所谓的读一致性。它的目的是读取某个时间点上的历史数据(而不是可能已经被修改了的数据),而不是避免悲观锁的使用。严格地说这不能称之为乐观锁,因为它既不Compare当前版本和历史版本,也不进行Set。事实上,在读取记录的历史快照时,当前记录有可能(由于并发的写操作)已经被加上独占锁。
进一步的问题是:有没有可能使用乐观锁来实现RDBMS中的写一致性?有没有可能使用乐观锁实现完整的ACID特性?
回答是可以。例如,MS
SQL
SERVER的Hekaton引擎通过一套基于时间戳的多版本管理系统,实现了不使用了悲观锁的ACID。
但是,这并不意味着乐观锁必然优于悲观锁。除了维护多版本的开销以外,乐观锁无法避免的一个问题是,当多个写操作试图更新同一个对象时,只有第一个操作可以成功,其它的操作都会在Compare时失败然后回滚,从而造成极大的性能问题。在这种情况下,乐观锁的性能会低于悲观锁。
目前的趋势似乎是,大规模的分布式数据库更倾向于使用乐观锁来达到所谓的external
consistency,因为基于传统悲观锁的分布式锁在集群大到一定程度以后(从几百台扩展到成千上万台时),性能开销就大得无法接受了。Google的Spanner就是基于乐观锁。当然这完全是另外一个问题了。
相关文章
- 韩语发音是 o bu sou you 什么意思
- “无法启动此程序,因为计算机中丢失log4cplus.dll。尝试重新安装该程序以解决此问题。”怎么办呢?
- odd party什么意思
- 微信小程序 loading 详解及实例代码
- huni退役了吗
- HP惠普LaserJet M1005 MFP打印机怎么扫描啊?用过的告知下(我的是64位win7)
- 材料送到工地承包商破产和承包商有合约关系,该怎么处理呢
- R9 380 4G显卡的性能不行吗?
- 主板BIOS里的Intel TXT (LT)需要打开吗?
- 朝夕相处的意思
- ibatis sql条件原理
- 210mb季包是多少流量
- plenary session是什么意思
- 山东乡村的婚宴大席菜被网友称硬核,你平时最喜欢吃什么?
- visualstudio和pycharm的社区版哪个更好用
- HYQiHei bejf 是什么字体
- 华为mate8是用的什么芯片?
- 马自达3星骋2.0 极速多少
- 薛之谦 专辑渡 分轨 无损 百度云
- ffmpeg protocol not found怎么解决
- 本周热门
-
- 李连杰家庭背景到底有多强大?爷爷爸爸的简介至今没人敢公开
- 赞美之泉 郑懋柔年龄
- QM,LF,SN,FL,LY,JS,KJ,KB,ML 是什么意思
- 谁有pthc comm 密码
- 115网盘正太gv礼包
- 妻しぼり汉化全cg存档
- 求surge for mac 破解版软件
- 英语里打嗝"belch","hiccup","burp"三者有什么区别?
- Cornerstone 4.2 Mac破解版出来了?
- 雅思听力 | 变化多端的同义替换
- 《只因我们天生一对》(一) 戏外篇同人文
- 加密网址,随便打开一个链接或图片跳转一下就可以了, 什么意思啊
- 有没有鸿源战纪?的修改器啊谢谢。
- 抖音音浪是什么?抖币和音浪的区别!【最全解释】
- 继AI换脸之后,又出现“一键去衣”软件,国外已有女性中招!
- BL(漫画版/资源)魔道祖师《香炉》番外
- 醉人不外花共酒,花是丽人酒是愁是什么意思
- 将CPU主频性能降到极低还能正常运行操作系统么?
- mom boy tube mobile
- “吹毛求疵”英语应该怎么翻译呢?
- 五本经典的都市职场言情小说!推荐丁墨《莫负寒夏》!全程高甜
- 老司机都会珍藏的5个资源网站,每一个都是精挑细选!
- 还记得大明湖畔的....奥,不对,那些网络用语吗?
- 很短的优美句子,文艺小清新,越看越入迷!
- 适合过生日发朋友圈的句子,文字表情包全配齐,建议收藏
- (呦 吧 论 坛) 和 (拯 救 天 使) 是同一个论坛的么
- 希腊字母的正确读法
- 你为何是一个Lithromantic?
- PC端游戏搬砖,QQSG(三国)出币攻略总结,简单入门
- 小学叠词词汇汇总整理二(ABB,AAB,ABAB,ABCC,AABC式词语)