Redis的事务与关系型数据库事务有何不同?

引言:关于 Redis 的事务很多人可能都是一知半解,大多数人只了解数据库的事务,并且是单体事务,对于 Redis 事务和常见关系型数据库的事务的区别还没有去了解过,本文就来详细进行介绍。

题目

Redis的事务与关系型数据库事务有何不同?

推荐解析

原子性差异

关系型数据库(比如 MySQL):事务中的所有操作要么全部完成,要么全部不完成,具有强原子性。
Redis:在 4.0 之前的版本中,事务实际上是通过 MULTI/EXEC 命令来实现的一系列命令的批量执行,如果中途某个命令失败,后续命令仍会执行。从 Redis 4.0 开始,引入了事务的原子性保证,但这种保证仅在客户端使用 MULTI/EXEC 时有效。

持久性差异

推荐去看下 MySQL 刷盘机制和 Redis 的刷盘机制,关于系统调用、后台线程、数据恢复等问题。

关系型数据库:事务完成后,更改的数据会被持久化到磁盘,即使系统崩溃也不会丢失。
Redis:作为一个内存数据库,数据主要存储在内存中。虽然 Redis 通过 RDB 和 AOF 机制提供了数据的持久化,但事务操作的持久性取决于配置和具体的持久化策略。

隔离性差异

关系型数据库:通常提供严格的隔离级别,如读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
Redis:单线程模型天然避免了并发导致的数据不一致问题,但 Redis 的事务没有隔离级别的概念,事务中的命令在执行前不会被其他客户端观察到,但执行过程中可能会与其他客户端的命令交错执行。

一致性差异

关系型数据库:在事务开始和结束时,数据库从一个一致的状态转移到另一个一致的状态。
Redis:事务保证了操作的原子性,但对一致性的支持取决于具体的操作和数据结构。

并发控制

关系型数据库:使用锁或其他并发控制机制来处理多个事务的并发执行。
Redis:由于单线程模型,Redis 自身不会在服务器端进行并发控制,但客户端库可能实现乐观锁或事务的其他并发控制机制。

事务范围

关系型数据库:事务可以跨越多个表和数据库对象。
Redis:事务通常局限于单个 Redis 连接和单个数据库实例。

单体事务 VS 分布式事务

单体事务通常指在一个单一的数据库管理系统(DBMS)内部执行的事务。这种事务涉及的操作都是针对同一个数据库实例。

分布式事务涉及多个数据库或服务,它们可能分布在不同的服务器、应用或地理位置上。

分布式事务比单体事务更复杂,涉及到网络通信、多个系统间的协调等。

分布式事务解决方案

关于分布式可以去了解下 CAP 理论和 BASE 理论,对分布式理解还是很有帮助的。

两阶段提交协议(2PC)
这是一种经典的分布式事务解决方案,通过准备阶段和提交阶段来确保所有参与者要么全部提交,要么全部回滚。

三阶段提交协议(3PC)
这是对2PC的改进,增加了超时机制,以解决协调者故障时参与者的阻塞问题。

补偿事务(TCC)
TCC 代表 Try、Confirm 和 Cancel 三个操作。在 Try 阶段进行资源检测和预留,在 Confirm 阶段提交业务操作,在 Cancel 阶段释放预留资源。

消息队列 + 事件驱动
利用消息队列来保证本地操作和发送消息的原子性,通过事件驱动架构来处理消息,实现最终一致性。

使用 Seata
Seata 是一个开源的分布式事务解决方案,支持 AT、TCC、Saga 和 XA 等事务模式,通过全局事务协调者和分支事务的协调来处理分布式事务。

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

随着Redis版本的升级,其架构从最初的单线程逐步引入了多线程特性,以提高性能和扩展性。以下是Redis单线程和多线程的升级历程,以及分布式锁的实现方法:

Redis单线程到多线程的升级

  1. Redis 4.0之前
    • Redis主要采用单线程模型,所有的命令执行和网络通信都在一个主线程中顺序执行。
  2. Redis 4.0及之后
    • 虽然Redis仍然主要在单个主线程中执行命令,但引入了后台线程处理一些耗时操作,如异步持久化、过期键的清理等。
  3. Redis 6.0
    • 引入了多线程特性,但主要用于处理网络IO的读写操作,而非命令执行。这意味着Redis仍然保持了单线程执行命令的原子性和一致性,同时利用多核CPU提高了网络IO的性能。

Redis多线程的实现

  • IO多线程:Redis 6.0通过配置文件启用IO多线程,可以设置多个IO线程来处理网络请求的读写操作。
  • 线程数设置:建议的线程数通常小于CPU核心数,以避免线程上下文切换的开销。
  • 命令执行:即使启用了多线程,Redis的命令执行仍然在主线程中顺序执行,保持了操作的原子性。

分布式锁的实现

分布式锁是分布式系统中用于同步不同进程或服务对共享资源访问的机制。以下是实现Redis分布式锁的一些常见方法:

  1. SETNX + EXPIRE
    • 使用SETNX命令尝试设置键,若成功则使用EXPIRE设置键的过期时间。
  2. SET命令扩展
    • 使用SET命令的NX(Not Exist)和EX(秒级过期)或PX(毫秒级过期)选项原子性地设置键和过期时间。
  3. Lua脚本
    • 通过Lua脚本保证SETNXEXPIRE的原子性执行,减少因命令分开执行导致的竞态条件。
  4. Redlock算法
    • 一种高级的分布式锁算法,通过尝试在多个独立的Redis实例上加锁来提高锁的安全性。
  5. Redisson框架
    • Redisson是一个基于Redis的Java客户端库,提供了多种分布式锁的实现,包括Redlock算法和自动续期机制。
  6. 多机分布式锁
    • 在多Redis实例部署的情况下,使用如Redisson提供的Redlock实现,确保分布式锁的高可用性和安全性。
  7. 其他实现
    • 包括使用Redisson的RLock对象或其他高级API来简化分布式锁的获取和释放操作。

分布式锁的最佳实践

  • 锁的粒度:尽量使用细粒度的锁,以减少锁争用。
  • 锁的超时:合理设置锁的超时时间,避免死锁。
  • 锁的重入:支持锁的重入性,允许同一线程多次获取同一把锁。
  • 锁的安全性:确保锁只能被持有者释放,防止其他线程误操作。

通过上述方法,Redis不仅可以通过多线程提升性能,还可以作为分布式系统中实现同步机制的关键组件。随着Redis版本的不断升级,其在分布式系统中的应用也越来越广泛。

欢迎交流

本文主要介绍 Redis 事务和常规的关系型数据库事务的不同之处,另外还有讲解单体事务和分布式事务的区别以及分布式事务的主要解决方案,关于代码实践部分需要读者自己去进行了解,因为一个案例并不能解决实际问题,需要不同场景进行对应的分析,在文末还有三个问题,欢迎小伙伴在评论区进行留言,面试鸭小程序已经全面上线,想要刷题备战实习拿 offer 的同学可以搜索面试鸭小程序!

1)Redis事务的原子性是如何在4.0版本之后得到改进的,相比于关系型数据库的事务原子性,它有哪些限制或不同之处?

2)在Redis 6.0引入多线程特性后,对于事务的处理方式有没有变化?如果有,这些变化对事务的执行和性能有哪些影响?

3)在实现分布式锁时,Redis的Redlock算法是如何确保在多个Redis实例之间保持锁的安全性的,它相比其他分布式锁实现方式有哪些优势和潜在的风险?

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

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

相关文章

Go微服务: 基于使用场景理解分布式之二阶段提交

概述 二阶段提交(Two-Phase Commit,2PC)是一种分布式事务协议,用于在分布式系统中确保多个参与者的操作具有原子性即所有参与者要么全部提交事务,要么全部回滚事务,以维持数据的一致性它分为两个阶段进行&…

Towards Graph Contrastive Learning: A Survey and Beyond

目录 Towards Graph Contrastive Learning- A Survey and Beyond摘要IntroductionPRELIMINARY符号说明GNN对比学习下游任务 GCL自监督学习增强策略基于规则随机扰动或mask子图采样图扩散 基于学习图结构学习图对抗训练图合理化 对比模式同尺度对比全局上下文局部 跨尺度对比局部…

Polar Web【中等】写shell

Polar Web【中等】写shell Contents Polar Web【中等】写shell思路&探索EXP运行&总结 思路&探索 初看题目,预测需要对站点写入木马,具体操作需要在过程中逐步实现。 打开站点(见下图),出现 file_put_contents 函数,其…

代码解读 | Hybrid Transformers for Music Source Separation[03]

一、背景 接着上一篇代码解读 | Hybrid Transformers for Music Source Separation[02]文章,继续对Hybrid Transformer Demucs 代码进行解读。 解读目标:明确数据从进入算法,在算法内部,以及在算法输出 这三个阶段中 数据的大小是…

pyqt 进度条QProgressBar

pyqt 进度条 QProgressBar效果代码 QProgressBar 在 PyQt 应用程序中,进度条(通常称为 QProgressBar)是一个用于显示任务进度的控件。它可以显示一个水平或垂直的条形图,条形图的长度会随着进度的增加而增加。 QProgressBar 的主…

分布式数据库架构:从单实例到分布式,开发人员需及早掌握?

现在互联网应用已经普及,数据量不断增大。对淘宝、美团、百度等互联网业务来说,传统单实例数据库很难支撑其性能和存储的要求,所以分布式架构得到了很大发展。而开发人员、项目经理,一定要认识到数据库技术正在经历一场较大的变革,及早掌握好分布式架构设计,帮助公司从古…

小米开放式耳机怎么样?倍思、西圣、小米开放式耳机测评比较!

作为一名热衷于分享真实体验的博主,我在过去两年开始接触开放式耳机,并因此受到许多朋友的咨询,询问哪款开放式耳机更加出色。为了找出最佳的开放式耳机,我进行了深入的调查和实地测试。我发现高价并不总是代表高质量,…

C++基础与深度解析 | 类与面向对象编程 | 数据成员 | 成员函数 | 访问限定符与友元 | 构造、析构成员函数 | 字面值类、成员指针与bind交互

文章目录 一、结构体与对象聚合二、成员函数(方法)三、访问限定符与友元1.访问限定符2.友元(慎用) 四、构造、析构与复制成员函数1.构造函数2.析构函数3.补充 五、字面值类,成员指针与bind交互1.字面值类2.成员指针3.b…

大小堆运用巧解数据流的中位数

​​​​​​​​​​ 一、思路 我们将所有数据平分成两份,前面那一部分用小堆来存,后面的部分用大堆来存,这样我们就能立刻拿到中间位置的值。 如果是奇数个数字,那么我们就将把中间值放在前面的大堆里,所以会有两种…

Windows取证分析 | 如何最大程度提升分析效率

本文由安全研究人员Amr Ashraf发表于Cyber5w的官方博客,研究人员在本文中讨论了如何对可疑设备中的内存映像进行安全调查,并利用了Volatility 3和MemProcFS来最大程度提升Windows取证分析的工作效率。 介绍 内存取证是任何计算机取证分析人员的必备技能…

如何给 MySQL 表和列授予权限?(官方版)

目录 授予表级别权限 授予列级别权限 如何给MySQL表和列授予权限是MySQL数据操作中非常重要的步骤,也是企业级使用MySQL数据库的起步点,以下分别参照官方教程整理的MySQL数据库的权限操作。 以下的语句可以直接使用MySQL的命令行进行操作(如何…

3038. 相同分数的最大操作数目 I

题目 给你一个整数数组 nums,如果 nums 至少包含 2 个元素,你可以执行以下操作: 选择 nums 中的前两个元素并将它们删除。一次操作的分数是被删除元素的和。 在确保所有操作分数相同的前提下,请你求出最多能进行多少次操作。 …

排序数组 ---- 分治-归并

题目链接 题目: 分析: 用这道题来回顾一下归并排序的思想找到中间结点, 将数组分成两半, 运用递归的思想, 继续对一半进行分半, 分到最后剩一个元素, 再将左右数组合并, 合并两个有序数组, 是先分解, 再合并的过程在合并两个有序数组时, 需要一个额外的数组来记录, 为了避免每…

Unity DOTS技术(九) BufferElement动态缓冲区组件

文章目录 一.简介二.例子 一.简介 在之前的学习中我们发现Entity不能挂载相同的组件的. 当我们需要用相同的组件时则可以使用.IBufferElementData接口 动态缓冲区组件来实现 二.例子 1.创建IBufferElementData组件 using Unity.Entities; using UnityEngine; //[GenerateAu…

three.js官方案例(animation / multiple)webgl_animation_multiple.html学习笔记

目录 ​编辑 1 骨架工具(SkeletonUtils) 1.1 clone方法 2 蒙皮网格(SkinnedMesh) 3 自测 4 webgl_animation_multiple.html全部脚本 1 骨架工具(SkeletonUtils) 用于操控 Skeleton、 SkinnedMesh、和…

网络编程: 高级IO与多路转接select,poll,epoll的使用与介绍

网络编程: 高级IO与多路转接select,poll,epoll的使用与介绍 前言一.五种IO模型1.IO的本质2.五种IO模型1.五种IO模型2.同步IO与异步IO3.IO效率 二.非阻塞IO1.系统调用介绍2.验证代码 三.select多路转接1.系统调用接口2.写代码 : 基于select的TCP服务器1.封装的Socket接口2.开始写…

1-Maven-settings配置

1-Maven-settings配置 整理下Maven工具的使用。 【本地仓库、私服、镜像仓库、远程仓库、中央仓库】 本文基于阅读其他博客和对公司Maven配置的学习整理出来的。希望通过本此学习能对Maven有个整体性的掌控。 顺序:profile.repository > pom文件中的repository &…

asp.net core使用httpclient

主要讲解常见的get请求和post请求 GET var client new HttpClient(); //3秒钟不响应就超时 client.TimeoutTimeSpan.FromSeconds(3); using HttpResponseMessage response await client.GetAsync("todos/3"); var jsonResponse await response.Content.ReadAsSt…

postman测试接口(springboot+shiro)带token也不通的解决方案

前几天做项目遇到个问题,在系统可以正常使用的接口,拿postman带token访问时候确一直不通(后台返回需要登录的提示信息) 但是我明明加了token的呀 打断点发现 subject.isAuthenticated()false 查资料猜测可能是因为请求的安全上…

【WP】猿人学_16_js逆向_window蜜罐

https://match.yuanrenxue.cn/match/16 抓包分析 荷载一个加密参数,一个时间戳 时间: 2024-06-07 15:52:31时间戳: 1717746751 1717746751000时间戳和现在对得上,直接生成就行。 追栈 追栈找m的生成位置。 点进去打断点,重新点击其他…