zoukankan      html  css  js  c++  java
  • Redis 事务

    Reids 事务的定义

    redis 事务就是一次性,顺序性的执行一个队列中的一系列命令,说白了就是一个连贯操作。
    

    重点

    单条命令是原子性执行的,但事务不保证原子性,且没有自动回滚。
    
    事务中任意命令执行失败,其余的命令仍会被执行。(和MySQL这种关系型数据库的区别)
    

    Redis 事务 基本命令

    1. multi:    标记一个事务块的开始
    
    2. exec:    执行所有事务块的命令
    
    3. discard:  取消事务,放弃事务块中的所有命令
    

    Redis 事务使用的场景

    已支付业务为例,正常情况下只有正常消费完成之后,才会减去账户余额。
    
    但如果没有事务的保障,可能会发生消费失败了,但依旧会把账户的余额给扣减了。
    

    Redis 扩展认知

    我们知道,在关系型数据库中,比如MySQL,如果要使用事务,首先向数据库服务器发送BEGIN,
    然后执行各个相互一致的写操作和读操作,最后,用户可以选择发送COMMIT来确认之前所作的修改,
    或者发送ROLLBACK来放弃那些修改。**
    
    同样,Redis中也有简单的方法处理一连串相互一致的读操作和写操作。首先是以MULTI命令开始
    事务,后续跟着一连串命令,最后以EXEC结束事务或者以DISCARD命令撤销所有命令并结束事务。
    
    但是redis事务和MySQL事务最重要的一点区别是,Reids事务不管指令正确或者错误,都会执行,
    中途遇见错误指令也会继续执行后面的命令,Redis并没有像MySQL那样的事务回滚机制。MySQL事务
    中如果执行过程中发生了错误不仅后面的sql语句不会执行,还会进行数据回滚,这是二者事务的最大区别。
    Redis的事务出错需要开发人员自己进行数据回滚等操作。
    
    Redis官方解释是: 当事务的执行时,一般发生错误都是因为业务编程错误造成的,这种错误通常只会出现在开发环境中,
    而基本很少会在实际的生产环境中出现(因为这种业务错误都会在测试的时候消灭),所以他认为没有必要为 Redis 开发
    事务自动回滚功能,这和Redis追求的简单高效的设计主旨不符合。
    
    **而mysql恰恰相反,mysql认为数据库有必要也有责任处理事务中报错的情况,所以mysql有自动回滚的功能。**
    
    

    在redis中使用事务:

    Mrliu:~ Mrliu$ redis-cli
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set test 123
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    127.0.0.1:6379> get test
    "123"
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set test 456
    QUEUED
    127.0.0.1:6379> discard
    OK
    127.0.0.1:6379> get test
    "123"
    127.0.0.1:6379> 
    
  • 相关阅读:
    典型用户模版和场景
    第一冲刺阶段——个人工作总结05
    第一冲刺阶段——个人工作总结04
    第一冲刺阶段——个人工作总结03
    第一冲刺阶段——个人工作总结02
    第一冲刺阶段——个人工作总结01
    学习进度条7
    构建之法阅读笔记06
    个人总结
    第十六周进度条
  • 原文地址:https://www.cnblogs.com/xinzaiyuan/p/12292620.html
Copyright © 2011-2022 走看看