• Redis事务的简单理解


    Redis事务的命令如下所示:

    先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令

    示例如下:

    //开始一个事务
    127.0.0.1:6379> MULTI
    OK
    //将3个元素添加到集合set-test中
    127.0.0.1:6379> SADD set-test c java c++
    QUEUED
    //遍历set-test集合
    127.0.0.1:6379> SMEMBERS set-test
    QUEUED
    //触发事务
    127.0.0.1:6379> EXEC 1) (integer) 3 2) 1) "c++" 2) "java" 3) "c" 127.0.0.1:6379>

     Redis 事务可以一次执行多个命令, 并且带有以下特征:

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

    注意:Redis的事务没有关系数据库事务提供的回滚(rollback) 功能,因此必须在事务执行出错后进行处理(比如将数据库复原回事务执行前的状态等)。

    由于Redis不支持回滚功能,也使得Redis在事务上可以保持简洁和快速。

    因此,在Redis事务中会出现两类错误:
    1.命令语法错误、参数错误等,命令没有进入事务的命令队列,直接就返回错误。
    2.命令进入事务的命令队列,但在执行EXEC后出错,例如对错误的数据类型使用了不支持的操作。

    客户端可以在事务提交前就感知到第一类错误,一般客户端在收到第一类错误时会discard当前事务。
    Redis2.6.5之前的版本在执行EXEC时会忽略第一类错误,执行队列中的其他命令。
    Redis2.6.5之后的版本会记录第一类错误,当执行EXEC命令时返回:
    (error) EXECABORT Transaction discarded because of previous errors.
    对于第二类错误,Redis会忽略失败的命令,继续执行队列中的其他命令。即一个事务内的操作,可能会出现一部分成功,一部分失败的情况。

    第一类错误,如下所示:

    //开始一个事务
    127.0.0.1:6379> MULTI
    OK
    //将3个元素添加到集合set-test中
    127.0.0.1:6379> SADD set-test c java c++
    QUEUED
    //遍历set-test集合的命令出错
    127.0.0.1:6379> SMEMBERS
    (error) ERR unknown command 'SMEM'
    //正确的遍历命令
    127.0.0.1:6379> SMEMBERS set-test
    QUEUED
    127.0.0.1:6379>
    //触发事务不成功
    127.0.0.1:6379> EXEC
    (error) EXECABORT Transaction discarded because of previous errors.
    127.0.0.1:6379>
  • 相关阅读:
    Jquery中的this是什么类型
    sorl的schema配置
    vim下常用的命令
    虚拟机克隆
    mysql突然无法连接:the driver has not received any packets from server communications link
    利用DOM的方式点击切换图片及修改文字
    javascript简易日历制作
    markdown数学公式输入指南
    Object.assign()
    引入css的方式
  • 原文地址:https://www.cnblogs.com/expiator/p/9414700.html
Copyright © 2020-2023  润新知