博客
关于我
Redis事务深入解析和使用
阅读量:793 次
发布时间:2023-02-28

本文共 2258 字,大约阅读时间需要 7 分钟。

Redis事务概述

前言

事务是关系型数据库中一项基础功能,用于将多个命令打包执行,确保所有命令按顺序完成后,才会处理其他命令。在支付系统中,事务的重要性尤为突出。例如,在消费过程中,只有正常完成后才会扣减账户余额。如果没有事务保障,可能会出现扣款失败但账户余额已扣减的情况,这显然无法接受。因此,事务是关系型数据库的核心功能之一。

事务基本使用

在其他语言中,事务通常分为三个阶段:

  • 开启事务
  • 执行业务逻辑
  • 处理异常(回滚事务)
  • Redis的事务机制虽然与其他语言不同,但同样遵循三个阶段。Redis的事务执行流程包括以下三个阶段:

  • 开启事务
  • 命令入列
  • 执行事务或放弃事务
  • 开启事务

    开启事务使用multi命令。执行multi后,客户端会进入事务模式,并返回OK。如果客户端已经处于事务模式,再次执行multi会返回错误ERR MULTI calls can not be nested,但不会终止事务状态。

    命令入列

    在事务模式下,所有命令依次入列,返回QUEUED。命令入列遵循FIFO原则,按顺序执行。

    执行事务或放弃事务

    执行事务使用exec命令,放弃事务使用discard命令。

    事务示例

    以下是事务执行示例:

    > multi
    OK
    > set k v
    QUEUED
    > exec
    1) OK
    > get k
    v

    放弃事务示例:

    > multi
    OK
    > set k v
    QUEUED
    > discard
    OK
    > get k
    v

    事务错误与回滚

    事务执行中的错误分为三类:

  • 执行时错误
  • 入列时错误(不终止事务)
  • 入列时错误(终止事务)
  • 执行时错误

    以下是执行时错误示例:

    > get k
    v
    > multi
    OK
    > set k v2
    QUEUED
    > expire k 10s
    QUEUED
    > exec
    1) OK
    2) (error) ERR value is not an integer or out of range
    > get k v2
    v2

    入列时错误(不终止事务)

    以下是入列时错误不终止事务示例:

    > get k v
    v
    > multi
    OK
    > set k v2
    QUEUED
    > multi
    (error) ERR MULTI calls can not be nested
    > exec
    1) OK
    > get k v2
    v2

    入列时错误(终止事务)

    以下是入列时错误终止事务示例:

    > get k v2
    v2
    > multi
    OK
    > set k v3
    QUEUED
    > set k
    (error) ERR wrong number of arguments for 'set' command
    > exec
    (error) EXECABORT Transaction discarded because of previous errors.
    > get k v2
    v2

    为什么不支持事务回滚?

    Redis不支持事务回滚的原因包括:

  • 编程错误通常发生在开发环境中,而非生产环境。
  • Redis内部设计复杂,支持事务回滚会影响性能和简单性。
  • 监控

    watch命令用于在多客户端环境下提供乐观锁。执行watch监控某个键,如果键在事务过程中被修改,整个事务终止。

    以下是watch示例:

    > watch k
    OK
    > multi
    OK
    > set k v2
    QUEUED
    > exec
    1) OK
    > get k
    nil

    unwatch命令用于取消监控。

    以下是unwatch示例:

    > set k v
    OK
    > watch k
    OK
    > multi
    OK
    > unwatch
    QUEUED
    > set k v2
    QUEUED
    > exec
    1) OK
    > get k
    v2

    事务在程序中使用

    以下是Java中使用Redis事务的示例:

    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.Transaction;
    public class TransactionExample {
    public static void main(String[] args) {
    Jedis jedis = new Jedis("xxx.xxx.xxx.xxx", 6379);
    jedis.auth("xxx");
    jedis.set("k", "v");
    jedis.watch("k");
    Transaction tx = jedis.multi();
    tx.set("k", "v2");
    tx.exec();
    System.out.println(jedis.get("k"));
    jedis.close();
    }
    }

    小结

    Redis的事务机制支持以下五个命令:

  • multi:开启事务
  • exec:执行事务
  • discard:放弃事务
  • watch:监控键
  • unwatch:取消监控
  • Redis的事务执行分为三个阶段:开启事务、命令入列、执行事务。Redis不支持传统的事务回滚,但在某些错误情况下提供回滚功能。

    思考题

  • Redis事务如何解决并发修改问题?
  • Redis是否支持事务回滚?
  • 在使用Redis事务时会出现哪三种错误?这三种错误对事务有何影响?
  • 转载地址:http://ubtfk.baihongyu.com/

    你可能感兴趣的文章
    Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)
    查看>>
    Palo Alto Networks PAN-OS身份认证绕过导致RCE漏洞复现(CVE-2024-0012)
    查看>>
    Panalog 日志审计系统 libres_syn_delete.php 前台RCE漏洞复现
    查看>>
    Panalog 日志审计系统 sprog_deletevent.php SQL 注入漏洞复现
    查看>>
    pandas :将时间戳转换为 datetime.date
    查看>>
    pandas :将行取消堆叠到新列中
    查看>>
    pandas DataFrame 中的自定义浮点格式
    查看>>
    Pandas DataFrame中的列从浮点数输出到货币(负值)
    查看>>
    Pandas Plots:周末的单独颜色,x 轴上漂亮的打印时间
    查看>>
    Pandas 中的多索引旋转
    查看>>
    Pandas 对数据框的布尔比较
    查看>>
    pandas 根据不是常量的第三列的值将值从一列复制到另一列
    查看>>
    Pandas 读取具有浮点值的 csv 文件会导致奇怪的舍入和小数位数
    查看>>
    pandas 适用,但仅适用于满足条件的行
    查看>>
    Pandas-从具有嵌套列表列表的现有列创建动态列时出错
    查看>>
    Pandas-通过对列和索引的值求和来合并两个数据框
    查看>>
    pandas.read_csv()的详解-ChatGPT4o作答
    查看>>
    PANDAS.READ_EXCEL()输出‘;溢出错误:日期值超出范围‘;而不存在日期列
    查看>>
    Pandas数据可视化怎么做?用实战案例告诉你!
    查看>>
    Pandas数据结构之DataFrame常见操作
    查看>>