• redis中的事务


    redis与mysql的事务

    Redis支持简单的事务

    这里写图片描述

    简单使用

    讲张三的100圆钱转账给lisi:

    set zhangsan 800
    set lisi 100
    multi
    decrby zhangsan 100
    incrby lisi 100
    exec

    失败的两种情况

    在mutil后面的语句中, 语句出错可能有2种情况,还是以转账的情况来分析:

    (1)语法就有问题

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> decrby zhang 100
    QUEUED
    127.0.0.1:6379> hasdfasdf
    (error) ERR unknown command 'hasdfasdf'
    127.0.0.1:6379> exec
    (error) EXECABORT Transaction discarded because of previous errors.
    127.0.0.1:6379> mget zhang wang
    1) "800"
    2) "100"

    这种,exec时,报错, 所有语句得不到执行,所以还是800和100圆

    (2)语法本身没错,但适用对象有问题

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> decrby zhang 100
    QUEUED
    127.0.0.1:6379> sadd wang 1
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 700
    2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
    127.0.0.1:6379> mget zhang wang
    1) "700"
    2) "100"
    

    Exec之后,会执行正确的语句,并跳过有不适当的语句,所以这里是一个700圆一个100圆了

    案例

    假设买票案例,当前只有1张票和100块钱,如果我在买票的过程中,在我multi之后,和exec之前,票被别人买了—即ticket已经变成0了,然后我们执行exec的时候就会将票变为-1,这就不对了。

    127.0.0.1:6379> set ticket 1
    OK
    127.0.0.1:6379> set money 100
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> decr ticket
    QUEUED
    127.0.0.1:6379> decrby money 10
    
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) -1
    2) (integer) 90
    

    使用watch来检测票有没有被买走

    实用watch来检测指定的key,负责监测key没有被改动。

    127.0.0.1:6379> set ticket 1
    OK
    127.0.0.1:6379> set money 100
    OK
    127.0.0.1:6379> watch ticket
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> decr ticket
    QUEUED
    127.0.0.1:6379> decrby money 10
    QUEUED
    127.0.0.1:6379> exec
    (nil)//返回nil,说明监视的ticket已经改变了,事务就取消了.
    127.0.0.1:6379> mget ticket money
    1) "0"
    2) "100"
    

    在执行exec之前,票被买走了,ticket为0了,然后执行exec后,发现ticket被动了,所以就不执行事务了,事务被取消了。在执行exec的时候返回nil

    watch相关用法

    watch key1 key2  ... keyN

    作用:监听key1 key2..keyN有没有变化,如果有变, 则事务取消

    unwatch 

    作用:取消所有watch监听

  • 相关阅读:
    牛客-DongDong数颜色 及其相似题
    设置某个exe文件为启动项
    oracle nvl nvl2 decode
    oracle 查看表空间名称大小以及物理路径
    oracle cmd导入、导出dup文件
    div模拟弹框窗口
    token工具类
    转 nginx报502 bad GateWay错误的解决方法
    转 Nginx connect() failed (110: Connection timed out)
    转 Cannot assign requested address出现的原因及解决方案
  • 原文地址:https://www.cnblogs.com/cnsec/p/13406984.html
Copyright © 2020-2023  润新知