Redis 事务

一、概述

和传统关系型数据库一样,Redis 同样是支持事务的。Redis 的事务可以通过 MULTI/EXEC/DISCARD/WATCH 等命令来实现。

二、事务的 ACID 特性

1). 原子性:事务中的命令要么全部执行,要么都不执行。

Redis 的事务和传统的关系型数据库事务最大的区别在于:Redis 事务不支持回滚,即使事务队列中某个命令执行期间出现了错误,整个事务也会继续执行下去,知道事务队列中所有命令执行完毕。

那么不支持回滚对 Redis 来说有何优势:不需要支持回滚,Redis 内部可以保证简单而快速。

不支持回滚是否合理:合理,事务队列中的命令在执行过程中,只会因为命令错误的语法而失败,而失败的命令是编程造成的,这些错误应该在开发过程中被发现,而不应该出现在生产环境中。

2). 一致性:数据库在事务执行之前是一致的,在事务执行后无论事务执行成功还是失败,数据库都应该是一致的。

“一致” 指的是数据符合数据库本身的定义和要求,没有非法或者无效的错误数据。Redis 通过谨慎的错误检测和简单的设计保证事务的一致性(详看本页:四)

3). 隔离性:各个事务之间不会相互影响,在并发状态下和在串行状态下执行事务的结果完全相同。

4). 持久性:当事务执行完毕后,结果保存到数据库中不会丢失。

  • 无持久化机制下,事务部具有持久性:服务器停机重启后数据丢失。
  • RDB 机制下,在特定条件下才会保存数据集快照,不能保证数据在第一时间被保存在硬盘中。
  • AOF 机制下,appendfsync = always 时,程序总会在执行命令之后调用同步函数,将命令数据存在硬盘中,这种情况下的事务具有持久性。
  • AOF 机制下,appendfsync = everysec 时候,程序会每秒同步一次数据到硬盘。因为停机可能就发生在命令执行完毕但是尚未同步的那一秒钟内,这样会造成事务数据丢失,故而不具有持久性。
  • AOF 机制下,appendfsync = no,由操作系统决定何时将数据同步到硬盘。因为事务数据可能在等待同步的过程中丢失,这样会造成事务数据丢失,故而不具有持久性。

三、相关命令的用法

1). MULTI 与 EXEC:MULTI 用于开启事务,总是返回 ok。MULTI 执行后,后面的命令暂时不会执行,而是会存到队列中,等到 EXEC 执行之后,队列中的命令才会依次序执行。例子如下:

Redis 事务

2). DISCARD 始终返回 ok,会清空事务队列,并且放弃执行事务。例子如下:

Redis 事务

3). WATCH 命令(想看本页:五)

四、Redis 怎样处理事务中的错误

Redis 怎样处理事务中的错误来保证数据库的 “一致性” :

1). 入队错误

可能原因:命令不存在,命令格式不正确等

处理方式:Redis 会对入队失败的命令进行记录,当调用 exec 的时候,自动拒绝执行并放弃这个事务。

例子如下:INCR mykey 1 入队失败,因为命令格式不正确。

Redis 事务

2). 执行错误

可能原因:命令语法错误(入队时无法检测,只有在执行的时候才会报错,比如事务中处理集合的命令用在了字符串上面)。

处理方式:事务中的命令执行失败,继续执行下一条命令,直至事务队列中的命令执行结束。

例子如下:LPOP mykey 报错,作用于 list 类型,不能用于字符串;但是不影响后续命令执行,+1 操作依然执行成功。

Redis 事务

3). 服务器停机

  • 如果服务器运行在无持久化的模式下,那么重启后的数据库是空白的,空白的数据库总是一致的。
  • 如果服务器运行在 RDB 模式下,可以利用现有的 RDB 文件还原数据库到一个一致的状态。若 RDB 文件找不到,那么重启后的数据库是空白的,空白的数据库总是一致的。
  • 如果服务器运行在 AOF 模式下,可以根据现有的 AOF 文件来恢复数据,将数据库还原到一个一致的状态。若 AOF 文件找不到,那么重启后的数据库是空白的,空白的数据库总是一致的。

综上所述,服务器停机不会影响数据库一致性。

五、WATCH 命令与乐观锁

WATCH 命令的返回值总是为 ok。

WATCH 命令本身就是一个乐观锁,它可以在 EXEC 命令执行之前,监视一定数量的 key,并在 EXEC 执行时,检查这些 key 是否被修改过,如果是的话,服务器就拒绝执行事务。例子如下:

时间 客户端A 客户端B T1 WATCH name T2 MULTI T3 SET name aa T4 SET name bb T5 EXEC

客户端 A 执行事务的时候发现 name 的值被修改了,所以服务器拒绝执行这个事务。

如何取消对 key 的监视:

  • WATCH 对 key 的监视从调用 WATCH 开始生效,直到调用 EXEC 为止。EXEC 被调用的时候不管事务是否执行,都会取消对 key 的监视。
  • 另外当客户端断开连接后也会取消监视。
  • 使用无参数的 UNWATCH 可以取消对所有 key 的监视。

Original: https://www.cnblogs.com/goody9807/p/7420032.html
Author: PointNet
Title: Redis 事务

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528862/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • gitlab拉取指定目录

    1.新建目录 mkdir git 2.初始化本地目录 git init 3.启用过滤的配置项 git config core.sparsecheckout true 4.想要拉取哪…

    Linux 2023年6月6日
    081
  • Pytorch的类(nn.Module的子类)中的forward函数

    使用 直接通过类的实例对象就可以向类中的forward函数进行参数的传递(当然也可以通过调用forward函数进行传参) import torch.nn as nn class M…

    Linux 2023年6月7日
    0105
  • 快速上手FastJSON

    作为一名后端开发而言肯定会接触数据,把数据提供给前端或者把数据存储起来,目前比较火热的传输格式是json,给前端传json是再常见不过啦,甚至是往db里面直接存入json。 在ja…

    Linux 2023年6月14日
    076
  • 巧妙绕过 “您的链接不是私密链接”

    大家上网的时候,有时候会碰到Chrome提示”您的链接不是私密链接”, 运气好的话,点击高级,有一个选项是”继续浏览不安全的网页”,…

    Linux 2023年6月13日
    0112
  • 那些技术实战中的架构设计方法

    上个月我写的一篇文章《关于技术能力的思考和总结》引起了大家的关注,好多读者的评论”以写代想、以想促真、以讲验真”,大家的感受很深刻,基于上次的文章,这篇文章…

    Linux 2023年6月8日
    083
  • 虚拟机网络地址配置你不知道的事儿-服务器的种类

    想必大家在初学Linux过程中,应该都是跟我一样白嫖一台虚拟机进行使用把,但是在大家白嫖的同时知不知道我们公司内是使用的什么样的服务器呢?公司肯定不会跟我们一样在自己电脑进行安装虚…

    Linux 2023年6月14日
    0118
  • 基础算法题

    Problem 3或5的倍数 2: 偶斐波那契数 4:最大回文乘积 5 窗口移动 11:方向数组 13大整数加法 、 14最长考拉兹序列 15:网格路径 25:1000位斐波那契数…

    Linux 2023年6月7日
    093
  • Linux安装宝塔,OCI8,连接ORACLE数据库

    基础环境 centos7 安装BT宝塔 网址:https://www.bt.cn/download/linux.h…

    Linux 2023年6月6日
    0101
  • 大华海康NVR录像JAVA下载及WEB播放

    近期在处理一个将NVR录像机上的录像下载到服务器并通过浏览器播放的需求。 梳理记录下过程,做个备忘,同时遇到的一些细节问题解决,也供需要的同学参考。 需求比较简单,就是把指定时间段…

    Linux 2023年6月13日
    0135
  • Golang 实现 Redis(8): TCC分布式事务

    本文是使用 golang 实现 redis 系列的第八篇, 将介绍如何在分布式缓存中使用 Try-Commit-Catch 方式来解决分布式一致性问题。 在上一篇文章中我们使用一致…

    Linux 2023年5月28日
    079
  • 多进程知识简单总结

    多进程间的全局变量不共享 一、代码展示 import multiprocessing as mul_p import time egg1 = 1 def write(egg2, q…

    Linux 2023年6月14日
    077
  • docker容器编排原来这么丝滑~

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概念介绍: Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Doc…

    Linux 2023年6月14日
    087
  • jmeter 安装与环境变量配置

    安装jmeter首先要安装与jmeter版本兼容的JDK,安装完成JDK后才能安装jmeter,JDK可以自行在官网下载或者通过360软件管家进行下载。 1、下载安装JDK 安装完…

    Linux 2023年6月8日
    087
  • python接收微信消息报’HTMLParser’ object has no attribute ‘unescape’错误

    我的博客 一直有个想法,想要弄个微信机器人,然而出师不利,刚开始就碰壁了 先上代码,这个是用来接收消息的,是个测试脚本 #!/usr/bin/python coding: utf-…

    Linux 2023年6月6日
    0104
  • Redis的穿透、击穿、雪崩之间的区别与联系

    [本文出自天外归云的博客园] 缓存穿透 redis查询后有数据库查询的情况,查的数据在数据库里本来就没有,所以缓存里也没有,所以查询穿透了缓存,直接落到了数据库上,这就是缓存穿透 …

    Linux 2023年5月28日
    077
  • Vue3 框架基础随笔 (一)

    Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 Vue可以使用简单的代码实现一个单页面应用。 基本格式 Vue通过模板语法来声明式的将数据渲…

    Linux 2023年6月14日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球