【Redis】Transaction(事务)

这篇具有很好参考价值的文章主要介绍了【Redis】Transaction(事务)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Redis】Transaction(事务),Redis,redis,缓存,数据库,服务器

🎯前言

Redis事务是一个组有多个Redis命令的集合,这些命令可以作为一个原子操作来执行。

Redis事务通常用于以下两种情况:

  1. 保证操作的原子性:在多个命令的执行过程中,如果有一个命令执行失败,整个事务都需要回滚(撤销)到事务开始前的状态,确保数据的一致性。

  2. 实现乐观锁:通过在事务中监视某些键,如果这些键在事务执行之前被其他客户端修改,则事务可以取消执行,从而避免了出现死锁或数据不一致的情况。

在Redis中,通过使用MULTI命令开始一个事务,然后将多个命令添加到事务中,最后使用EXEC命令来执行这些命令。如果事务中的任何一个命令执行失败,可以使用DISCARD命令来取消事务,或者使用UNWATCH命令来取消对键的监视。

Redis的与事务相关的命令说明:

  1. DISCARD:用于取消一个事务,放弃事务中所有未执行的命令,并恢复到事务开始前的状态。
  2. EXEC:用于执行一个事务,将所有已组装但未执行的命令一次性执行,并返回执行结果。
  3. MULTI:用于组装一个事务,将多个命令放入事务中,等待后续的EXEC命令来执行这些命令。
  4. UNWATCH:用于取消对所有键的监视,这个命令通常在使用WATCH命令监视一些键时使用,以确保在执行事务之前,这些键没有被其他客户端修改。
  5. WATCH:用于监视一些键,一旦这些键在事务执行之前被改变,则取消事务的执行。这个命令通常与MULTI命令一起使用,用于实现类似于"乐观锁"的效果。

这些命令通常用于保证在Redis事务中的操作的原子性和一致性。通过将多个命令放入同一个事务中,可以确保这些命令作为一个整体一起执行,并且在有其他客户端对被监视的键进行修改时,能够适当地处理冲突和错误。

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  1. 批量操作在发送 EXEC 命令前被放入队列缓存。
  2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  1. 开始事务。
  2. 命令入队。
  3. 执行事务。

🎯DISCARD(取消事务,放弃执行事务块内的所有命令)

说明:

  • DISCARD命令是Redis事务的一部分,用于取消当前事务,恢复到事务开始前的状态。
  • 使用DISCARD命令可以在事务执行过程中取消事务,并且不会对已有的键值产生影响。

时间复杂度:

  • O(1)。

返回值:

  • 总是返回 OK 

以下是一个使用DISCARD命令的示例代码:

127.0.0.1:6379> multi # 开始一个事务
OK
127.0.0.1:6379> set key1 "value1" # 添加一个SET命令到事务中
QUEUED
127.0.0.1:6379> set key2 "value2" # 添加另一个SET命令到事务中 
QUEUED
127.0.0.1:6379> discard # 取消事务,不执行SET命令
OK
  • 在这个示例中,通过使用DISCARD命令,第一个SET和第二个SET命令不会生效,并且整个事务都被取消了。
  • 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
  • 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

🎯EXEC(执行所有事务块内的命令)

说明:

  • EXEC命令是Redis事务的一部分,用于执行事务中所有添加的命令。
  • 当使用EXEC命令时,事务中的所有命令将作为一个原子操作被执行,如果有一个命令执行失败,整个事务将回滚到开始前的状态。
  • 举例:假如某个(某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么 EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断终止。

时间复杂度:

  • 事务块内所有命令的时间复杂度的总和。

返回值:

  • 事务块内所有命令的返回值,按命令执行的先后顺序排列。
  • 当操作被打断时,返回空值 nil 。

以下是一个使用EXEC命令的示例代码:

# 事务被成功执行


127.0.0.1:6379> MULTI
OK


127.0.0.1:6379> INCR userid
QUEUED


127.0.0.1:6379> INCR userid
QUEUED


127.0.0.1:6379> INCR userid
QUEUED

redis> PING
QUEUED

redis> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG


# 监视 key ,且事务成功执行

127.0.0.1:6379> WATCH lock lock_value
OK

127.0.0.1:6379> MULTI
OK

127.0.0.1:6379> SET lock "xiaojian"
QUEUED

127.0.0.1:6379> INCR lock_value
QUEUED

127.0.0.1:6379> EXEC
1) OK
2) (integer) 1


# 监视 key ,且事务被打断

127.0.0.1:6379> WATCH lock lock_value     # 监视lock键 和 lock_value键
OK

127.0.0.1:6379> MULTI     # 开始一个事务
OK

127.0.0.1:6379> SET lock "mr"        # 就在这时,另一个客户端修改了 lock 键的值,另一个客户端修改 这个被监视的 lock键,此时事务必定是失败的!
QUEUED

127.0.0.1:6379> SET lock_value    # 此时就算 lock_value 没被修改,事务失败已成定局。
QUEUED

127.0.0.1:6379> EXEC                  # 因为 lock 被其他客户端修改,事务自动取消执行。
(nil)

🎯MULTI(标记一个事务块的开始)

说明:

  • MULTI命令是Redis事务的一部分,用于开始一个新事务,并将后续的命令添加到这个事务中,直到使用EXEC命令执行这些命令为止。
  • 事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。
  • 使用MULTI命令可以将多个命令添加到事务中,并且可以在需要时使用DISCARD命令取消事务,或者使用EXEC命令执行事务中的所有命令。

时间复杂度:

  • O(1)。

返回值:

  • 返回 OK 。

以下是一个使用MULTI命令的示例代码:

127.0.0.1:6379> multi # 标记事务开始
OK
127.0.0.1:6379> set key1 value1  # 多条命令按顺序入队
QUEUED
127.0.0.1:6379> set key2 valus2
QUEUED
127.0.0.1:6379> exec # 执行
1) OK
2) OK



  • 在这个示例中,通过使用MULTI命令,将两个SET命令添加到事务中,使用EXEC命令执行事务中的所有命令。或者可以使用DISCARD命令取消事务,这样两个SET命令都不会被执行。
  • MULTI命令是Redis事务的一个重要组成部分,用于开始一个新事务并将后续的命令添加到这个事务中。

🎯UNWATCH(取消 WATCH 命令对所有 key 的监视)

说明:

  • UNWATCH命令是Redis事务的一部分,用于取消对所有键的监视,这个命令通常在使用WATCH命令监视一些键时使用,以确保在执行事务之前,这些键没有被其他客户端修改。
  • 当使用UNWATCH命令时,Redis将取消对所有键的监视,如果有其他客户端在这些键上执行了修改操作,也不会影响当前客户端的事务执行。
  • 如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。
  • 因为 EXEC 命令会执行事务,因此 WATCH 命令的效果已经产生了;而 DISCARD 命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行 UNWATCH 了。

时间复杂度:

  • O(1)。

返回值:

  • 总是 OK 。

以下是一个使用UNWATCH命令的示例代码:

127.0.0.1:6379> WATCH lock lock_value
OK

127.0.0.1:6379> UNWATCH
OK

🎯WATCH(监视一个或多个key ,在事务执行之前这个或这些 key 被其他命令所改动,那么事务将被打断)

说明:

  • WATCH命令是Redis事务的一部分,用于监视一些键,一旦这些键在事务执行之前被其他客户端修改,则事务会取消执行,从而避免了出现死锁或数据不一致的情况。
  • 当使用WATCH命令时,客户端将开始监视指定的键,如果这些键在其他客户端上被修改,当前客户端的事务将自动取消执行。

时间复杂度:

  • O(1)。

返回值:

  • 总是返回 OK 。

以下是一个使用WATCH命令的示例代码:文章来源地址https://www.toymoban.com/news/detail-541477.html

127.0.0.1:6379> watch key1  # 监视一个键  (注意:可以一条命令监视多个键  如:WATCH key1 key2)

127.0.0.1:6379> watch key2  # 再监视一个键  

127.0.0.1:6379> multi # 开始一个事务  

127.0.0.1:6379> set("key1", "value1")  # 在被监视的键上进行SET操作  

127.0.0.1:6379> set("key2", "value2")  # 在被另外
  • 当使用WATCH命令监视了两个键后,开始一个新事务,并在被监视的键上执行SET操作,如果这些键在其他客户端上被修改,事务会自动取消执行。

到了这里,关于【Redis】Transaction(事务)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis---数据库和缓存如何保证一致性?

    用「读 + 写」请求的并发的场景来分析: 假如某个用户数据在缓存中不存在,请求 A 读取数据时从数据库中查询到年龄为 20,在未写入缓存中时另一个请求 B 更新数据。它更新数据库中的年龄为 21,并且清空缓存。这时请求 A 把从数据库中读到的年龄为 20 的数据写入到缓存

    2024年01月24日
    浏览(41)
  • Redis如何保证缓存和数据库一致性?

    现在我们在面向增删改查开发时,数据库数据量大时或者对响应要求较快,我们就需要用到Redis来拿取数据。 Redis:是一种高性能的内存数据库,它将数据以键值对的形式存储在内存中,具有读写速度快、支持多种数据类型、原子性操作、丰富的特性等优势。 优势: 性能极高

    2024年01月16日
    浏览(54)
  • Redis如何保障缓存与数据库的数据一致性问题?

    目录 一.最经典的数据库加缓存的双写双删模式 二. 高并发场景下的缓存+数据库双写不一致问题分析与解决方案设计 三、上面高并发的场景下,该解决方案要注意的问题 1.1 Cache Aside Pattern概念以及读写逻辑 (1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取

    2023年04月21日
    浏览(36)
  • 数据库缓存服务——NoSQL之Redis配置与优化

    目录 一、缓存概念 1.1 系统缓存 1.2 缓存保存位置及分层结构 1.2.1 DNS缓存 1.2.2 应用层缓存 1.2.3 数据层缓存 1.2.4 硬件缓存 二、关系型数据库与非关系型数据库 2.1 关系型数据库 2.2 非关系型数据库 2.3 关系型数据库和非关系型数据库区别: 2.4 非关系型数据库产生背景 2.5 总结

    2024年02月15日
    浏览(36)
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息 Redis 客户端可以订阅任意数量的频道 Redis主从复制是指在Redis中设置一个主节点(Master)和一个或多个从节点(Slave),

    2024年02月15日
    浏览(35)
  • Springboot+Redis:实现缓存 减少对数据库的压力

    🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 Redis实战与进阶 本专栏讲解Redis从原理到实践 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn.net/   目录 缓存如何实现?

    2024年03月24日
    浏览(41)
  • redis面试题目-如何保证数据库与缓存的数据一致性

    原视频:https://www.bilibili.com/video/BV1Km4y1r75f?p=62vd_source=fa75329ae3880aa55609265a0e9f5d34 由于缓存和数据库是分开的,无法做到原子性的同时进行数据修改,可能出现缓存更新失败,或者数据库更新失败的情况,这时候会出现数据不一致,影响前端业务 先更新数据库,再更新缓存。缓

    2024年02月05日
    浏览(47)
  • Redis缓存MySQL数据库存储二者如何保证数据一致性

    在大型互联网应用中,由于数据库读写频繁、压力大等原因,我们通常会使用缓存来减少数据库的访问次数,提高系统的性能。而Redis作为一个高性能的内存数据库,成为了缓存的首选方案之一。但是,缓存和数据库之间存在数据一致性的问题,如何解决这个问题呢?本文将

    2023年04月19日
    浏览(39)
  • 如何保证Redis缓存和数据库的一致性问题

    熟练掌握Redis缓存技术? 那么请问Redis缓存中有几种读写策略,又是如何保证与数据库的一致性问题 今天来聊一聊常用的三种缓存读写策略 首先我们来思考一个问题 写 先更新缓存 再更新数据库 首先如果缓存更新成功但数据库更新失败,会导致数据不一致的问题 其次当请求

    2024年02月14日
    浏览(41)
  • Redis 缓存与数据库双写不一致如何解决

    Redis缓存与数据库双写不一致是一个常见的挑战,但可以通过一些方法来解决或减轻这种不一致性。以下是一些可能的解决方案: 事务处理: 在进行缓存和数据库双写时,确保它们被包含在同一事务中。这可以通过使用支持事务的数据库和Redis事务来实现。这样,要么两者同

    2024年01月21日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包