美文网首页
Redis事务操作

Redis事务操作

作者: 攻城老狮 | 来源:发表于2020-12-19 14:02 被阅读0次

    事务

    • Redis事务的本质:一组命令集合,一个事务中的所有命令会被序列化,在事务执行过程中会按照顺序依次执行

    • Redis事务的特性:一次性、顺序性、排他性

    • Redis事务没有隔离级别;Redis单条命令保证原子性,但事务不保证原子性

    • Redis事务:开启事务 -> 命令入队 -> 执行事务

    1. 正常事务
    127.0.0.1:6379> multi # 开启事务
    OK
    127.0.0.1:6379> set name yorick # 命令依此入队
    QUEUED
    127.0.0.1:6379> set age 23
    QUEUED
    127.0.0.1:6379> get name
    QUEUED
    127.0.0.1:6379> set address beijing
    QUEUED
    127.0.0.1:6379> exec # 执行事务
    1) OK
    2) OK
    3) "yorick"
    4) OK
    
    1. 放弃事务
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set name yorick
    QUEUED
    127.0.0.1:6379> set age 23
    QUEUED
    127.0.0.1:6379> discard # 放弃事务
    OK
    
    1. 命令语法错误(编译性错误)
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set name yorick
    QUEUED
    127.0.0.1:6379> set age # 命令语法错误
    (error) ERR wrong number of arguments for 'set' command
    127.0.0.1:6379> set address beijing
    QUEUED
    127.0.0.1:6379> exec # 全部命令均不会执行
    (error) EXECABORT Transaction discarded because of previous errors.
    
    1. 执行中遇到错误(运行时错误)
    127.0.0.1:6379> set name yorick
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set address beijing
    QUEUED
    127.0.0.1:6379> incr name # 运行时出错
    QUEUED
    127.0.0.1:6379> set height 181
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) (error) ERR value is not an integer or out of range
    3) OK
    127.0.0.1:6379> get height # 其他命令均可被正常执行
    "181"
    

    监控

    • ​ 悲观锁:认为什么时候都会出现问题,无论进行什么操作均会加锁

      ​ 乐观锁:认为什么时候都不会出现问题,不上锁。更新数据时再去判断在此期间是否修改过该数据。

    • Redis可以通过watch监控数据,实现乐观锁

    1. 正常执行
    127.0.0.1:6379> set money 100
    OK
    127.0.0.1:6379> set output 0
    OK
    127.0.0.1:6379> watch money # 监控money数据
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> decrby money 10
    QUEUED
    127.0.0.1:6379> incrby output 10
    QUEUED
    127.0.0.1:6379> exec # 正常执行,未有其他线程更改money数据
    1) (integer) 90
    2) (integer) 10
    
    1. 多线程修改值,乐观锁操作
    127.0.0.1:6379> set money 100
    OK
    127.0.0.1:6379> set output 0
    OK
    127.0.0.1:6379> watch money # 监控
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> decrby money 20
    QUEUED
    127.0.0.1:6379> incrby output 20
    QUEUED
    127.0.0.1:6379> exec # 此时另外一个线程修改了money的值,导致更改失败
    (nil)
    127.0.0.1:6379> get money # 发现此时money值未被修改
    "1000"
    127.0.0.1:6379> get output
    "0"
    

    参考地址:https://www.bilibili.com/video/BV1S54y1R7SB

    相关文章

      网友评论

          本文标题:Redis事务操作

          本文链接:https://www.haomeiwen.com/subject/odhxnktx.html