0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

剖析!Redis事务实现原理

张康康 2019-07-29 18:27 次阅读

作者 | Video++极链科后端Team刘聪

整理 | 包包

所谓事务(Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。事务必须满足ACID原则(原子性、一致性、隔离性和持久性)。简单来说事务其实就是打包一组操作(或者命令)作为一个整体,在事务处理时将顺序执行这些操作,并返回结果,如果其中任何一个环节出错,所有的操作将被回滚。

在Redis中实现事务主要依靠以下几个命令来实现:

剖析!Redis事务实现原理


Redis事务从开始到结束通常会通过三个阶段:

1.事务开始

2.命令入队

3.事务执行

以下是一个最简单的Redis事务流程:

剖析!Redis事务实现原理


第一步跟其他的关系型数据库类似,也是需要开启一个事务,在Redis中的命令如下:

剖析!Redis事务实现原理


Redis中使用MULTI命令标记事务的开始,可以理解为在传统关系型数据库中的BEGIN TRANCATION语句,Redis将执行该命令的客户端从非事务状态切换成事务状态,这一切换是通过在客户端状态的flags属性中打开REDIS_MULTI标识完成, 我们看下Redis中对应部分的源码实现:

剖析!Redis事务实现原理


在打开事务标识的客户端里,这些命令都会被暂存到一个命令队列里,不会因为用户会的输入而立即执行。

第二步就是执行事务内路基,即真正的业务逻辑:

剖析!Redis事务实现原理


最后一个阶段是提交事务(或者回滚事务):

剖析!Redis事务实现原理


这两个命令可被视为等同于关系型数据库中的COMMIT/ROLLBACK语句。

这里需要注意的是,在客户端打开了事务标识后,只有命令:EXEC,DISCARD,WATCH,MULTI命令会被立即执行,其它命令服务器不会立即执行,而是将这些命令放入到一个事务队列里面,然后向客户端返回一个QUEUED回复 ;Redis客户端有自己的事务状态,这个状态保存在客户端状态mstate属性中,mstate的结构体类型是multiState,我们看下multiState的定义:

剖析!Redis事务实现原理


我们再看下结构体类型multiCmd的结构:

剖析!Redis事务实现原理


事务队列以先进先出的保存方法,较先入队的命令会被放到数组的前面,而较后入队的命令则会被放到数组的后面。

当开启事务标识的客户端发送EXEC命令的时候,服务器就会执行,客户端对应的事务队列里的命令,我们来看下EXEC 的实现细节:

剖析!Redis事务实现原理


最后我们再回顾一下事务本身的特性, 在传统关系型数据库中的事务必须依靠ACID来保证事务的可靠性和安全性,在Redis中事务总是具有一致性(Consistency)和隔离性(Isolation),并且当Redis运行在某种特定的持久化模式下,事务也具有耐久性(Durability); 但是并不总是能够保证原子性(Atomicity),在正常状态下一个事务的所有命令是能按照原子性的原则执行的,但是执行的中途遇到错误,不会回滚,而是继续执行后续命令, 如下:

剖析!Redis事务实现原理


如果在set k2 v2处失败,set k1已成功不会回滚,set k3还会继续执行;Redis的事务和传统的关系型数据库事务的最大区别在于,Redis不支持事务的回滚机制,即使事务队列中的某个命令在执行期间出现错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止,我们看下面的例子:

剖析!Redis事务实现原理


Redis的作者在事务功能的文档中解释说,不支持事务回滚是因为这种复杂的功能和Redis追求的简单高效的设计主旨不符合,并且他认为,Redis事务的执行时,错误通常都是编程错误造成的,这种错误通常只会出现在开发环境中,而很少会在实际的生产环境中出现,所以他认为没有必要为Redis开发事务回滚功能。所以我们在讨论Redis事务回滚的时候,一定要区分命令发生错误的时候。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏

    评论

    相关推荐

    华为云 Flexus X 轻松实现 Redis 一主多从高效部署

    ,Flexus X 预装 Redis 加速镜像,简化了 Redis 的安装和配置流程,降低了威廉希尔官方网站 门槛,使开发者能够更专注于业务逻辑的实现。         本文将详细介绍如何在华为云 Flexus X 上
    的头像 发表于 12-27 13:45 171次阅读
    华为云 Flexus X 轻松<b class='flag-5'>实现</b> <b class='flag-5'>Redis</b> 一主多从高效部署

    Redis缓存与Memcached的比较

    Redis和Memcached都是广泛使用的内存数据存储系统,它们主要用于提高应用程序的性能,通过减少对数据库的直接访问来加速数据检索。以下是对Redis和Memcached的比较,涵盖了它们的一些
    的头像 发表于 12-18 09:33 154次阅读

    nginx+lua+redis实现灰度发布

    作者:马仁喜 前言: 授人以鱼不如授人以渔 .先学会用,在学原理,在学创造,可能一辈子用不到这种能力,但是不能不具备这种能力。这篇文章主要是沉淀使用nginx+lua+redis实现灰度,当我们具备
    的头像 发表于 12-17 10:01 81次阅读

    全新NVIDIA NIM微服务实现突破性进展

    全新 NVIDIA NIM 微服务实现突破性进展,可助力气象威廉希尔官方网站 公司开发和部署 AI 模型,实现对降雪、结冰和冰雹的预测。
    的头像 发表于 11-21 10:07 218次阅读

    Spring事务实现原理

    这些操作。 spring事务有编程式事务和声明式事务两种实现方式。编程式事务是通过编写代码来管理事务
    的头像 发表于 11-08 10:10 828次阅读
    Spring<b class='flag-5'>事务实现</b>原理

    恒讯科技分析:云数据库rds和redis区别是什么如何选择?

    结构化数据,使用SQL作为查询语言,支持ACID事务和多种复杂查询操作。而Redis是一个基于内存的非关系型数据库,采用键值对模型存储数据,支持丰富的数据结构如字符串、列表、集合、哈希表等。 2、性能:Redis以其超快的速度而
    的头像 发表于 08-19 15:31 406次阅读

    Redis 开源协议调整,我们怎么办?

    2 024 年 3 月 20 日, Redis 官方宣布,从 Redis 7.4 版本开始,Redis 将获得源可用许可证 ( RSALv2 ) 和服务器端公共许可证 ( SSPLv1 ) 的双重
    的头像 发表于 05-09 22:59 438次阅读
    <b class='flag-5'>Redis</b> 开源协议调整,我们怎么办?

    Redis开源版与Redis企业版,怎么选用?

    点击“蓝字”关注我们数以千计的企业和数以百万计的开发人员Redis开源版来构建应用程序。但随着用户数量、数据量和地区性的增加,成本、可扩展性、运营和可用性等问题也随之而来。Redis企业版
    的头像 发表于 04-04 08:04 1081次阅读
    <b class='flag-5'>Redis</b>开源版与<b class='flag-5'>Redis</b>企业版,怎么选用?

    GaussDB(for Redis) 特性揭秘:大 key 治理

      从 DBA 的视角看,大 Key 无疑是引起 Redis 线上问题的常见原因。为了解决大 Key 隐患,业务首先要遵守合理的开发规范,减少大 Key 的产生和访问依赖。但有时大 Key 是在程序
    的头像 发表于 03-28 22:06 670次阅读
    GaussDB(for <b class='flag-5'>Redis</b>) 特性揭秘:大 key 治理

    GaussDB(for Redis) 游戏实践:玩家下线行为上报

    实现以上功能时,感知用户下线行为延迟较大,导致上报时间不准确。华为云 GaussDB(for Redis)作为一款企业级游戏数据库,具备卓越的企业级能力,能及时上报用户下线行为,并被广泛应用于排行榜等多种业务场景。 基于 Redis
    的头像 发表于 03-28 22:03 529次阅读

    新版 Redis 不再“开源”,对使用者都有哪些影响?

    2024 年 3 月 20 日,Redis Labs 宣布从 Redis 7.4 开始,将原先比较宽松的 BSD 源码使用协议修改为 RSAv2和 SSPLv1协议。该变化意味着 Redis
    的头像 发表于 03-27 22:30 503次阅读
    新版 <b class='flag-5'>Redis</b> 不再“开源”,对使用者都有哪些影响?

    Redis实现分布式多规则限流的方式介绍

    市面上很多介绍 Redis 如何实现限流的,但是大部分都有一个缺点,就是只能实现单一的限流,比如 1 分钟访问 1 次或者 60 分钟访问 10 次这种,但是如果想一个接口两种规则都需要满足呢,我们的项目又是分布式项目,应该如何
    的头像 发表于 02-26 10:07 500次阅读
    <b class='flag-5'>Redis</b><b class='flag-5'>实现</b>分布式多规则限流的方式介绍

    Redis官方搜索引擎来了,性能炸裂!

    RediSearch 是一个 Redis 模块,为 Redis 提供查询、二级索引和全文搜索功能。
    的头像 发表于 02-21 10:01 2378次阅读
    <b class='flag-5'>Redis</b>官方搜索引擎来了,性能炸裂!

    Redis可以实现消息中间件MQ的功能

    是一种通信模式:发送者(PUBLISH)发送消息,订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递   Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息
    的头像 发表于 01-25 14:48 949次阅读
    <b class='flag-5'>Redis</b>可以<b class='flag-5'>实现</b>消息中间件MQ的功能

    腾讯科技获区块链网络事务处理专利

    据专利摘要介绍,此方法涉及的步骤可概括如下:收集待处理事务数据集的统计信息,此数据集含有多个接收并待处理的事务数据;制定获取区块链网络对事务数据的打包标准;如果统计信息符合打包要求,将事务
    的头像 发表于 01-08 11:36 569次阅读