• Redis(五)的事务



    活动地址:CSDN21天学习挑战赛

    一.Redis的事务

    一般我们的Redis都是当缓存来用,当然也可以当做数据库来用,即非关系型数据库,故此他是有事务的,但是真的不好用

    • 没有回滚(所以需要配合 watch 一起使用)

    Redis的事务:一次事务操作,改成功的成功,该失败的失败。

    先开启事务,执行一些列的命令,但是命令不会立即执行,会被放在一个队列中,如果你执行事务,那么这个队列中的命令全部执行,如果取消了事务,一个队列中的命令全部作废。

    - 开启事务:multi

    • 输入要执行的命令:被放入到一个队列中
      - 执行事务:exec
    • 取消事务:discard

    Redis的事务想发挥功能,需要配置watch监听机制

    在开启事务之前,先通过watch命令去监听一个或多个key,在开启事务之后,如果有其他客户端修改了我监听的key,事务会自动取消。

    如果执行了事务,或者取消了事务,watch监听自动消除,一般不需要手动执行unwatch。

    1.1事务中的异常情况

    redis中事务的异常情况总的来说分为两类:
    1.进入队列之前就能发现的错误,比如命令输错;
    2.执行EXEC之后才能发现的错误,比如给一个非数字字符加1;

    那么对于这两种不同的异常,redis中有不同的处理策略。对于第一种错误,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务(这个是2.6.5之后的版本做法,之前的版本做法小伙伴可以参考官方文档)。

    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> set kv1 v1
    QUEUED
    127.0.0.1:6379> set k2 v2
    QUEUED
    127.0.0.1:6379> set k3 v3 3 3
    QUEUED
    127.0.0.1:6379> set k4 v4
    QUEUED
    127.0.0.1:6379> EXEC

    1. OK
    2. OK
    3. (error) ERR syntax error
    4. OK
      127.0.0.1:6379> keys *
    5. “k4”
    6. “k2”
    7. “kv1”

    而对于第二种情况,redis并没有对它们进行特别处理, 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行。如下:

    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> set k1 vv
    QUEUED
    127.0.0.1:6379> INCR k1
    QUEUED
    127.0.0.1:6379> EXEC

    1. OK
    2. (error) ERR value is not an integer or out of range
      127.0.0.1:6379> GET k1
      “vv”

    不同于关系型数据库,redis中的事务出错时没有回滚,对此,官方的解释如下

    Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
    本文参考江南一点雨大佬

    1.2 和事务配合使用的WATCH指令

    事务中的WATCH命令可以用来监控一个key,通过这种监控,我们可以为redis事务提供(CAS)行为。 如果有至少一个被WATCH监视的键在EXEC执行之前被修改了,那么整个事务都会被取消,EXEC返回nil-reply来表示事务已经失败。

  • 相关阅读:
    Win11使用WSL2安装ubuntu,ubuntu桌面配置,ubuntu子系统删除
    09_GateWay—网关介绍
    nodejs+vue毕业生就业知道信息平台系统
    解决vue ui无法远程访问的问题
    探索Web3前沿:革新性算力共享平台,重塑数字资源利用新时代
    十二、消息服务(1)
    计算机网络——TCP/IP网络层次模型
    简易node ts代码给json进行sort或者diff
    RHCE之WEB服务器作业
    udev 挂载SD卡 USB设备
  • 原文地址:https://blog.csdn.net/weixin_43189971/article/details/126338470