LiSheng's blog LiSheng's blog
首页
笔记
个人简历
随笔集
GitHub (opens new window)
首页
笔记
个人简历
随笔集
GitHub (opens new window)
  • golang

  • cplus

  • leetcode

  • 存储技术

  • 分布式系统

  • 计算机网络

  • Linux操作系统

  • Redis

    • 大纲
    • redis持久化策略
    • redis事务
    • redis分布式锁
    • redis高可用
    • redis主从同步
    • Redis是什么
    • Redis基本数据结构
    • Redis为什么这么快
    • 缓存击穿、缓存穿透、缓存雪崩
    • 热Key问题,如何解决热key问题
    • Redis 过期策略和内存淘汰策略
    • Redis 的持久化机制
    • Redis的高可用
    • 使用过Redis分布式锁
    • Redis的跳跃表
    • MySQL与Redis 如何保证双写一致性
    • Redis的Hash 冲突怎么办
    • 布隆过滤器
    • Redis 事务机制
    • 其他

    • 笔记
    • Redis
    lisheng
    2024-09-10
    目录

    Redis 事务机制

    Redis 的事务机制是通过一组命令原子性地执行操作,确保命令在执行时不会被其他客户端打断。Redis 事务相对简单,主要依赖于三个命令:MULTI、EXEC 和 WATCH。

    # Redis 事务的基本概念

    1. 事务的定义:

      • 在 Redis 中,事务是一组命令的集合,这些命令会被按顺序执行,而不会被其他命令插入或打断。所有命令都会在一次执行中全部成功,或者在某些情况下全部不执行。
    2. 事务的四个阶段:

      • 开始事务: 使用 MULTI 命令开始一个事务。
      • 命令入队: 事务开始后,所有的命令都会依次入队,Redis 不会立即执行这些命令。
      • 执行事务: 使用 EXEC 命令提交事务,Redis 将依次执行队列中的所有命令。
      • 放弃事务: 使用 DISCARD 命令可以放弃一个事务,清空命令队列。

    # 事务命令

    1. MULTI:

      • 开始一个事务。之后的命令会被放入事务队列中,等待执行。
      • 执行 MULTI 后,Redis 会返回 OK 表示事务开始成功。
    2. EXEC:

      • 提交事务。Redis 会依次执行事务队列中的命令,并返回每个命令的执行结果。
      • 如果事务中的任何命令执行失败,EXEC 不会中止事务的执行,其他命令仍然会继续执行。
    3. DISCARD:

      • 放弃事务。清空事务队列,并退出事务状态。
      • 执行 DISCARD 后,事务中的命令将不再执行,Redis 返回 OK 表示事务已取消。
    4. WATCH:

      • 乐观锁机制的一部分。WATCH 命令用于监控一个或多个键,在 EXEC 执行之前,如果被监控的键发生变化(如被其他客户端修改),整个事务会被中止,不会执行 EXEC。
      • 这可以防止因并发修改导致的事务冲突。
    5. UNWATCH:

      • 取消所有通过 WATCH 监控的键,通常用于放弃监控操作。

    # Redis 事务的特点

    1. 原子性:

      • Redis 事务内部的每条命令会按顺序依次执行,不会被其他客户端的命令插入。然而,事务并不能保证整体的原子性,也就是说,如果事务执行过程中某个命令失败,Redis 并不会自动回滚整个事务中已经执行的命令。
    2. 隔离性:

      • 在事务执行的过程中,其他客户端无法看到事务中间状态的数据。Redis 确保事务的隔离性,通过单线程执行命令,避免了多客户端并发执行命令时的冲突。
    3. 无回滚:

      • Redis 的事务机制简单且高效,但没有回滚功能。一旦事务中的某个命令执行失败,其他命令仍然会继续执行,这意味着 Redis 事务在某种程度上是“部分失败”的。
    4. 乐观锁机制(WATCH):

      • 通过 WATCH 机制,Redis 提供了一种基于乐观锁的事务控制手段。当事务提交时,如果被 WATCH 的键发生了变化,EXEC 会中止执行,这种方式适用于需要避免并发修改的场景。

    # 事务的使用示例

    # 简单事务

    MULTI
    SET key1 "value1"
    SET key2 "value2"
    INCR counter
    EXEC
    
    1
    2
    3
    4
    5

    在这个例子中,MULTI 开始事务,SET 和 INCR 命令入队,EXEC 提交事务并依次执行命令。

    # 使用 WATCH 的事务

    WATCH key1
    MULTI
    SET key1 "new_value"
    SET key2 "value2"
    EXEC
    
    1
    2
    3
    4
    5

    这里,WATCH key1 监控 key1。如果在 EXEC 执行前,key1 被其他客户端修改,事务会被中止。

    # Redis 事务的注意事项

    1. 命令入队和执行顺序:

      • 在事务内提交的命令不会立即执行,而是会按顺序进入队列。EXEC 提交后,这些命令会按顺序执行。
    2. 事务失败的处理:

      • 事务中的某个命令执行失败,并不会导致整个事务的中止或回滚,因此在编写 Redis 事务时需要注意命令的执行顺序和依赖关系。
    3. WATCH 键的自动取消:

      • EXEC 执行后,无论事务是否成功,WATCH 的监控都会自动取消。

    # 总结

    Redis 事务是一种轻量级的机制,能够确保一组命令按顺序执行,适用于需要多个命令组合操作的场景。然而,由于没有自动回滚的机制,对于对数据一致性要求非常高的场景,Redis 事务需要结合 WATCH 和其他手段来确保数据的正确性。

    编辑 (opens new window)
    上次更新: 2024/09/13, 11:59:12
    布隆过滤器
    Git使用手册

    ← 布隆过滤器 Git使用手册→

    最近更新
    01
    ceph分布式存储-对象存储(RGW)搭建
    10-27
    02
    ceph分布式存储-集群客户端连接
    10-27
    03
    ceph分布式存储-管理crushmap
    10-27
    更多文章>
    Theme by Vdoing
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式