华为云企业级Redis揭秘第16期:超越开源Redis的ACID"真"事务
摘要: 开源Redis只支持伪事务,应用场景受限。高斯Redis发布企业级事务特性,支持完备ACID,为交易、库存等上层业务带来全新可能。
本文分享自华为云社区《华为云企业级Redis揭秘第16期:超越开源Redis的ACID"真"事务》,作者: 高斯Redis官方博客 。
日常生活中的shopping、交通、手游都离不开高频的金融消费、虚拟交易。熟悉MySQL的读者,一定知道数据库事务(Transaction)可以搞定这类关键场景,事务不但极大简化了上层业务的编程模型,给开发者带来便利,同时它也让“交易”等核心业务正确可靠。
其实,Redis也有事务,但社区版只做了简版实现,无法满足ACID要求,因此应用有限。
本文将介绍华为云企业级数据库GaussDB(for Redis)(下文简称为高斯Redis)的事务功能,与社区版不同,高斯Redis提供了满足ACID的企业级事务特性。
1.什么是事务?
请设想如下场景:
在一个月黑风高之夜,一场交易正在进行。玩家B收款成功,但A却没拿到装备。
好了,一场PK在所难免。

玩家做几次点击即可完成交易,但底层数据库内部,却需要执行至少4个关键操作:

试想,如步骤4失败,而前置步骤成功,会发生逻辑错乱,这将带来灾难性的用户体验。
事务是如何解决这类场景的?这依赖于4大特性:
- 原子性(Atomicity):一组操作要么全成功,要么全失败。
- 一致性(Consistency):即满足既定约束,保证系统不脱离合理状态。例如,如果A、B各有50枚金币,那么全局总数应始终保持100。
- 隔离性(Isolation):多个事务的执行相互隔离,互不影响。
- 持久性(Durability):提交成功的事务应带来永久性状态变化,即使掉电,数据也不应丢失。
其中,一致性是最关键的,而原子性、隔离性、持久性都是为了保证一致性。当然,为了确保整体系统的一致性,也需要业务层的共同设计实现,本文不详细展开。
那么,开源Redis事务存在哪些问题,GaussDB(for Redis)的企业级事务功能又是什么样的?下面我们来具体看看。
2. 从四大特性看Redis的事务
2.1 原子性
社区版Redis
开源Redis事务是一种极简设计,并不支持事务失败时的回滚操作,不满足事务的原子性。
此外还有以下问题:
- 入队校验不完备:只校验简单语法,无法识别key的类型错误;
- 错误处理不完备:直接跳过错误,继续执行后续命令。
GaussDB(for Redis)

如图所示,开源Redis事务在第一条命令出错的情况下仍旧执行了下面的命令,而高斯Redis则避免了这样的问题。
- 每个事务的执行在提交前会进行错误判断,如有错误则会触发回滚逻辑,放弃之前的操作,对原数据无影响
高斯Redis在保留社区版事务使用逻辑的同时,在底层实现了对回滚的支持,满足了事务的原子性。
2.2 隔离性
社区版Redis
事务在并发执行时,应当处理各种隔离性问题。
开源Redis对命令的执行是单线程设计,因此的确可以保证不会有两个事务同时被执行,具体来看:
- 开源Redis不存在隔离性问题;
- 代价是性能的降低和对整体吞吐的影响,事务只能单线程处理,对其他请求的干扰较大。
GaussDB(for Redis)
高斯Redis是多线程架构,内部对数据进行自动分片,在同数据分片内保留序列化的隔离性级别,同时极大提高整体实例的并发能力。

2.3 持久性
社区版Redis
开源Redis是纯内存设计,不提供可靠的数据存储能力。掉电后数据丢失,即使开启RDB或AOF,也只能在一定程度上挽回部分数据,具体来看:
- RDB方式会丢失部分数据,数据只能恢复到上次快照的时间
- 即使是AOF方式,持久性也存在问题,从命令执行到保存到硬盘之间,仍旧存在时间差
- AOF方式恢复缓慢、维护文件庞大,维护管理成本都会非常高,重建时间也很长
综合来看,社区版Redis的持久化能力有限,不足以支持事务的持久性要求。
GaussDB(for Redis)
高斯Redis采用存算分离的设计理念,底层使用高性能分布式存储池保存全量数据,结合RocksDB存储引擎,可保证核心数据的可靠存储,架构图:

GaussDB(for Redis)核心优势:
- 核心数据存储:全量数据落盘,3副本冗余,不怕丢数据
- 高可用:秒级故障接管,即使N-1节点故障,全量数据也可用
- 低时延:自动冷热分离,亚毫秒级时延,能Hold缓存场景
- 高吞吐:全部节点可写,QPS可水平扩展,能抗流量高峰
- 强一致:3副本强一致同步,不会发生脏读,业务免踩坑
- 秒扩容:例如,8G到64G扩容只需1秒,且对业务0影响
- 降成本:数据量越大价格越香,能够真正帮用户省成本
高斯Redis强大的持久化保障,支持核心数据的可靠存储,也为事务的执行提供了有力的保证。
2.4 一致性
从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性,可以说在ACID中一致性是事务的目的,其他特性是手段。
如上文所述,开源Redis在原子性和持久性上都存在种种问题,一致性自然也无法保障。在上述特性的保障下,不论是正常执行还是存在命令失败场景,高斯Redis事务都有可靠的一致性。
2.5 对比总结
通过上述介绍我们从事务的四大特性出发详细地介绍了高斯Redis的事务,最后做一个总结:

3. 结语
近年来,以Redis为代表的KV数据库逐渐在越来越多的场景发挥作用,而高斯Redis作为华为云旗舰KV数据库,可满足企业核心数据的可靠存储要求。
高斯Redis的事务能力相比社区版Redis有极大提升,在ACID事务的加持下,更可在“库存”、“交易”等关键场景简化业务设计,带来可靠数据存储能力。
4. 附录
- 本文作者:华为云数据库GaussDB(for Redis)团队
- 杭州/西安/深圳简历投递:yuwenlong4@huawei.com
- 产品资料导航:https://bbs.huaweicloud.com/blogs/248875
华为云企业级Redis揭秘第16期:超越开源Redis的ACID"真"事务的更多相关文章
- 华为云PB级数据库GaussDB(for Redis)揭秘第七期:高斯Redis与强一致
摘要:在KV数据库领域,"强一致性"不仅是一个技术名词,它更是业务与运维的重要需求. 清明刚过,五一假期就要来了.大好春光,不如去婺源看油菜花吧!小云迅速打开APP刷出余票2张,赶 ...
- 华为云PB级数据库GaussDB(for Redis)揭秘第八期:用高斯 Redis 进行计数
摘要:高斯Redis,计数的最佳选择! 一.背景 当我们打开手机刷微博时,就要开始和各种各样的计数器打交道了.我们注册一个帐号后,微博就会给我们记录一组数据:关注数.粉丝数.动态数-:我们刷帖时,关注 ...
- 华为云企业级Redis评测第一期:稳定性与扩容表现
摘要:采用Redis Labs推出的多线程压测工具memtier_benchmark对比测试下GaussDB(for Redis) 和原生Redis的特性差异. 本文分享自华为云社区<华为云企业 ...
- 华为云分布式缓存服务DCS与开源服务差异对比
华为云分布式缓存DCS提供单机.主备.集群等丰富的实例类型,满足用户高读写性能及快速数据访问的业务诉求.支持丰富的实例管理操作,帮助用户省去运维烦恼.用户可以聚焦于业务逻辑本身,而无需过多考虑部署.监 ...
- 大海航行靠舵手 华为云靠什么征服K8S?
Kubernetes 是Google开源的容器集群管理系统或者称为分布式操作系统.它构建在Docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,本质上可看作是基于 ...
- 揭秘丨7分钟看懂华为云鲲鹏Redis背后的自研技术【华为云技术分享】
2019年5月,华为云发布全球首个基于自研ARM架构的分布式缓存鲲鹏Redis,搭载华为LibOS+华为编译器+安全容器引擎三项黑科技,在保证Redis强劲高性能外,还降低客户30%的使用成本,真正实 ...
- 关于购买Redis服务器:腾讯云、阿里云还是华为云?
个人分类: redis使用 编辑 新年伊始,很多商家都开始进行新年产品大促销,在分布是缓存Redis领域,几家大公司也是打得如火如荼,各有千秋啊. 现在市场上比较有口碑的商家有腾讯云.阿里云.华为云三 ...
- Spring Boot 最流行的 16 条实践解读!【华为云技术分享】
置顶:华为云618大促火热进行中,全场1折起,免费抽主机,消费满额送P30 Pro,点此抢购. Spring Boot是最流行的用于开发微服务的Java框架.在本文中,将与大家分享自2016年以来笔者 ...
- [动图演示]Redis 持久化 RDB/AOF 详解与实践【华为云技术分享】
Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集 合.以及散列等,并且还支持多种排序功能. 什么叫持 ...
随机推荐
- dart系列之:手写Library,Library编写最佳实践
目录 简介 使用part和part of src中的文件 package中的lib文件 总结 简介 Library是dart用来组织代码的一种非常有用的方式,通过定义不同的Library,可以将非常有 ...
- HDU 2099 整除的尾数(枚举 & 暴搜)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2099 思路分析:这道题的解法可以说是相当暴力了,但也有一些小坑,以下几点萌新们值得留意一下: 1. 仔 ...
- RHCSA 第五天
1. a.创建普通变量local_data=1并访问 [root@sss ~]#local_data=1 [root@sss ~]#echo local_data local_data [root@s ...
- Termux搭建hexo博客并部署到GitHub
Termux搭建hexo博客并部署到GitHub 安装 termux-change-repo apt update apt install git && nodejs &&am ...
- python极简教程07:封装、多态和继承
测试奇谭,BUG不见. 这一场主讲python的面向对象部分--封装.多态和继承. 目的:掌握Python面向对象的三个核心概念. 封装 01 什么是封装? 封装的目的是,保护隐私.通俗的讲:不想让别 ...
- vue3路由的使用,保证你有所收获!
路由变量 有的小伙伴,可能是第一次听见路由变量这个词. 什么是路由变量了,顾名思义就是这个路由地址是动态的,不是固定的. 它的运用场景是哪里呢? 比如说:1.详情页的地址,我们就可以去使用路由变量. ...
- 【SpringCloud-Alibaba】环境搭建以及注意事项
一.开发环境 JDK 1.8 SpringBoot 2.1.7.RELEASE SpringCloud-Alibaba 2.1.2.RELEASE 数据库MySQL 5.8 如果需要修改版本请参照:S ...
- 网络编程-跨域资源共享 CORS
目录 1.什么是同源策略? 2.跨域资源共享 CORS 3.预检请求 4.CORS相关字段 5.Golang实现跨域 6.参考资料 1.什么是同源策略? 如果两个 URL 的 protocol.por ...
- gin的源码解读4-gin的路由算法
gin的路由算法 gin的是路由算法其实就是一个Trie树(也就是前缀树). 有关数据结构的可以自己去网上找相关资料查看. 注册路由预处理 我们在使用gin时通过下面的代码注册路由 普通注册 rout ...
- 查看Linux系统信息
1.查看内核 [root@localhost etc]# uname -aLinux localhost.localdomain 3.10.0-514.el7.x86_64 #1 SMP Tue No ...