Redis高级之——事务回滚

本文深入解析Redis事务机制,包括事务的开启、执行、取消及工作流程。探讨事务在执行过程中的注意事项,如语法错误和运行错误的处理方式,以及如何通过程序确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Redis执行指令过程中,多条连续执行的指令被干扰,打断,插队

redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性

按照添加顺序依次执行,中间不会被打断或者干扰。

什么是事务

Redis执行指令过程中,多条连续执行的指令被干扰,打断,插队

redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性

按照添加顺序依次执行,中间不会被打断或者干扰。

一个队列中,一次性、顺序性、排他性的执行一系列命令

事务的基本操作
  • 开启事务

    multi
    
  • 作用:设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中

  • 执行事务

    exec
    
  • 作用:设定事务的结束位置,同时执行事务。与multi成对出现,成对使用

在这里插入图片描述

注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行

事务定义过程中发现出了问题,怎么办?
  • 取消事务

    discard
    
  • 作用:终止当前事务的定义,发生在multi之后,exec之前

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f1WzXczv-1595894126120)(C:\Users\栾昊\AppData\Roaming\Typora\typora-user-images\image-20200728055659843.png)]

事务的工作流程

在这里插入图片描述

事务的注意事项

定义事务的过程中,命令格式输入错误怎么办?

  • 语法错误:指命令书写格式有误
  • 处理结果:如果定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会执行。包括那些语法正确的命令。

如下图

在这里插入图片描述

定义事务的过程中,命令执行出现错误怎么办?

  • 运行错误:指命令格式正确,但是无法正确的执行。例如对list进行incr操作

  • 处理结果:能够正确运行的命令会执行,运行错误的命令不会被执行

如下图
在这里插入图片描述

注意:已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己在代码中实现回滚。

手动进行事务回滚
  • 记录操作过程中被影响的数据之前的状态
    • 单数据:string
    • 多数据:hash、list、set、zset
  • 设置指令恢复所有的被修改的项
    • 单数据:直接set(注意周边属性,例如时效)
    • 多数据:修改对应值或整体克隆复制

总结

通过上面两个例子,可以看出Redis在执行事务命令的时候,在命令入队的时候, Redis 就会检测事务的命令是否正确,如果不正确则会产生错误。无论之前和之后的命令都会被事务所回滚,就变为什么都没有执行。

当命令格式正确,而因为操作数据结构引起的错误 ,则该命令执行出现错误,而其之前和之后的命令都会被正常执行。这点和数据库很不一样,这是需注意的地方。

对于一些重要的操作,我们必须通过程序去检测数据的正确性,以保证 Redis 事务的正确执行,避免出现数据不一致的情况。 Redis 之所以保持这样简易的事务,完全是为了保证移动互联网的核心问题一----性能。

### Redis 面试知识点思维导图 #### 一、基础概念 - **定义与特性** - 基于内存的数据结构存储系统,支持多种数据类型的持久化[^1]。 - **应用场景** - 缓存服务、消息队列、会话管理等。 #### 二、性能优化 - **网络模型** - 使用 I/O 多路复用来处理多个 Socket 请求,减少因网络延迟带来的影响。具体实现包括连接应答处理器、命令回复处理器以及命令请求处理器等功能模块。 - **持久化机制** - RDB 和 AOF 是两种主要的持久化方式,各有优缺点,在实际应用中可根据需求选择合适的策略。 #### 三、高级功能 - **事务支持** - 提供简单的乐观锁机制——WATCH/MULTI/EXEC 指令集,允许执行一系列操作作为一个整体提交或回滚。 - **发布订阅模式** - 支持 Pub/Sub 功能,可以用于构建实时通知系统或其他需要广播消息的应用场景。 #### 四、集群架构 - **主从复制** - 实现高可用性和负载均衡的重要手段之一;通过配置 master-slave 关系让 slave 节点同步 master 的状态变化。 - **哨兵监控(Sentinel)** - 自动监测并切换故障节点的服务角色转换工具,保障系统的稳定运行。 - **分片(Sharding)** - 将数据分布到不同的实例上以提高扩展能力的方法论,适用于大规模分布式环境下的高效访问控制。 #### 五、常见问题排查 - **慢查询日志分析** - 记录耗时较长的操作语句及其参数列表,便于定位性能瓶颈所在位置。 - **内存溢出解决方案** - 当遇到 OOM 错误时可采取调整 maxmemory 参数限制最大占用量或是启用 LRU 策略淘汰不常用条目等方式解决资源紧张状况。 ```mermaid mindmap root((Redis)) 基础概念 定义与特性 "基于内存" "数据结构存储" 应用场景 缓存服务 消息队列 会话管理 性能优化 网络模型 IO多路复用 连接应答处理器 命令回复处理器 命令请求处理器 持久化机制 RDB AOF 高级功能 事务支持 WATCHMULTIEXEC指令集 发布订阅模式 PubSub 集群架构 主从复制 哨兵监控Sentinel 分片Sharding 常见问题排查 慢查询日志分析 内存溢出解决方案 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值