Redis学习_Redis事务

本文介绍了Redis中的事务,它是一组命令集合,保证执行时不被打断。阐述了事务操作命令,如开启、执行、放弃事务等。还说明了事务的实现情况,包括正常执行、入队命令错误、执行命令错误等。此外,详细讲解了Redis的watch机制,通过监视key值变化来决定事务是否执行。

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


1. 什么是Redis中的事务

  • 事务是指一系列操作步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。
  • 而Redis 中的事务(transaction)是一组命令的集合,至少是两个或两个以上的命令,redis事务保证这些命令被执行时中间不会被任何其他操作打断。

2. 事务操作的命令

2.1 开启事务 — multi

  • 语法: multi
  • 作用: 标记一个事务的开始。事务内的多条命令会按照先后顺序被放进一个队列当中。
  • 返回值: 总是返回 ok

2.2 执行事务块中的命令 — exec

  • 语法: exec
  • 作用: 执行所有事务块内的命令
  • 返回值:
    • 正常事务内的所有执行语句内容
    • 事务被打断(影响)返回 nil

2.3 放弃事务 — discard

  • 语法: discard
  • 作用: 取消事务,放弃执行事务块内的所有命令
  • 返回值:总是返回 ok

2.4 监视一个或多个key是否被改变 — watch

  • 语法: watch key [key …]
  • 作用: 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
  • 返回值:总是返回 ok

2.5 取消watch监视 — unwatch

  • 语法: unwatch
  • 作用: 取消 WATCH 命令对所有 key 的监视。如果从sdqe在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了
  • 返回值: 总是返回 ok

3. 事务的实现

3.1 正常执行事务

  • 事务的执行步骤: 首先开启事务, 其次向事务队列中加入命令,最后执行事务提交
  • 例 1:事务的执行:
    • multi : 用 multi 命令告诉 Redis,接下来要执行的命令你先不要执行,而是把它们暂时存起来 (开启事务)
    • sadd works john 第一条命令进入等待队列(命令入队)
    • sadd works rose 第二条命令进入等待队列(命令入队)
    • exec 告知 redis 执行前面发送的两条命令(提交事务)
    • 查看 works 集合
      在这里插入图片描述

3.2 事务执行 exec 之前,入队命令错误(语法错误;严重错误导致服务器不能正常工作(例如内存不足)) — 放弃事务

  • 例:执行事务步骤:
    • MULTI 正常命令
    • SET key value 正常命令
    • INCR 命令语法错误
    • EXEC 无法执行事务,那么第一条正确的命令也不会执行,所以 key 的值不会设置成功
  • 结论: 事务执行 exec 之前,入队命令错误,事务终止,取消,不执行。
    在这里插入图片描述

3.3 事务执行 exec 命令后,执行队列命令,命令执行错误 — 事务提交

    • MULTI 正常命令
    • SET username zhangsan 正常命令
    • lpop username 正常命令,语法没有错误,执行命令时才会有错误。
    • EXEC 正常执行 ,发现错误可以在事务提交前放弃事务,执行 discard.
    • 结论:
      • 在 exec 执行后的所产生的错误, 即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。
      • Redis 在事务失败时不进行回滚,而是继续执行余下的命令。
      • Redis 这种设计原则是:Redis 命令只会因为错误的语法而失败(这些问题不能在入队时发现),或是命令用在了错误类型的上面,失败的命令并不是 Redis 导致,而是由编程错误造成的,这样错误应该在开发的过程中被发现,生产环境中不应出现语法的错误。就是在程序的运行环境中不应该出现语法的错误。而 Redis 能够保证正确的命令一定会被执行。再者不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
        在这里插入图片描述

3.4 放弃事务

  • 执行步骤:
    • MULTI 开启事务
    • SET age 25 命令入队
    • SET age 30 命令入队
    • DISCARD 放弃事务,则命令队列不会被执行
      在这里插入图片描述

3.5 Redis 的 watch 机制

3.5.1 Redis 的 WATCH 机制

  • WATCH 机制原理:
    • WATCH 机制: 使用 WATCH 监视一个或多个 key , 跟踪 key 的 value 修改情况, 如果有key 的 value 值在事务 EXEC 执行之前被修改了, 整个事务被取消。EXEC 返回提示信息,表示事务已经失败。
  • WATCH 机制使的事务 EXEC 变的有条件,事务只有在被 WATCH 的 key 没有修改的前提下才能执行。不满足条件,事务被取消。使用 WATCH 监视了一个带过期时间的键, 那么即使这个键过期了, 事务仍然可以正常执行
  • 大多数情况下, 不同的客户端会访问不同的键, 相互同时竞争同一 key 的情况一般都很少, 乐观锁能够以很好的性能解决数据冲突的问题。

3.5.2 何时取消 key 的监视(WATCH)?

  • WATCH 命令可以被调用多次。 对键的监视从 WATCH 执行之后开始生效,直到调用 EXEC 为止。不管事务是否成功执行, 对所有键的监视都会被取消。
  • 当客户端断开连接时, 该客户端对键的监视也会被取消。
  • UNWATCH 命令可以手动取消对所有键的监视

3.5.3 WATCH 的事例

  • 执行步骤:
  • 首先启动 redis-server , 在开启两个客户端连接。
  • A 客户端
    • WATCH 某个 key , 同时执行事务
  • B 客户端
    • 对 A 客户端 WATCH 的 key 修改其 value 值。
      -例:
    • 在 A 客户端设置 key : str.lp 登录人数为 10
    • 在 A 客户端监视 key : str.lp
    • 在 A 客户端开启事务 multi
    • 在 A 客户端修改 str.lp 的值为 11
    • 在 B 客户端修改 str.lp 的值为 15
    • 在 A 客户端执行事务 exec
    • 在 A 客户端查看 str.lp 值,A 客户端执行的事务没有提交,因为 WATCH 的 str.lp 的值已经被修改了, 所有放弃事务。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
内容概要:本文详细介绍了扫描单分子定位显微镜(scanSMLM)技术及其在三维超分辨体积成像中的应用。scanSMLM通过电调透镜(ETL)实现快速轴向扫描,结合4f检测系统将不同焦平面的荧光信号聚焦到固定成像面,从而实现快速、大视场的三维超分辨成像。文章不仅涵盖了系统硬件的设计与实现,还提供了详细的软件代码实现,包括ETL控制、3D样本模拟、体积扫描、单分子定位、3D重建和分子聚类分析等功能。此外,文章还比较了循环扫描与常规扫描模式,展示了前者在光漂白效应上的优势,并通过荧光珠校准、肌动蛋白丝、线粒体网络和流感A病毒血凝素(HA)蛋白聚类的三维成像实验,验证了系统的性能和应用潜力。最后,文章深入探讨了HA蛋白聚类与病毒感染的关系,模拟了24小时内HA聚类的动态变化,提供了从分子到细胞尺度的多尺度分析能力。 适合人群:具备生物学、物理学或工程学背景,对超分辨显微成像技术感兴趣的科研人员,尤其是从事细胞生物学、病毒学或光学成像研究的科学家和技术人员。 使用场景及目标:①理解和掌握scanSMLM技术的工作原理及其在三维超分辨成像中的应用;②学习如何通过Python代码实现完整的scanSMLM系统,包括硬件控制、图像采集、3D重建和数据分析;③应用于单分子水平研究细胞内结构和动态过程,如病毒入侵机制、蛋白质聚类等。 其他说明:本文提供的代码不仅实现了scanSMLM系统的完整工作流程,还涵盖了多种超分辨成像技术的模拟和比较,如STED、GSDIM等。此外,文章还强调了系统在硬件改动小、成像速度快等方面的优势,为研究人员提供了从理论到实践的全面指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值