• redis事务


    是什么

    可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,不许加塞!

    可以一口气攒着,不需要立刻知道结果。但是一定要确保数据的准确性!分红就是这样的!

    排好队,一次性的执行多个redis的命令!

    能干嘛

    一个队列中,一次性的、顺序性的、排他性的执行一系列的命令。要么一起成功,要么一起失败。

    怎么玩

    通过MULTI指令开启,之后输入多个命令!Redis将它们加入到队列当中,所有的命令通过EXEC来开启执行!

    通过DISCARD来放弃本次的批处理操作!

    例子:银行转账,要么成功,要么失败。

    192.168.1.66:6379> MULTI
    OK
    192.168.1.66:6379> set k1 v1
    QUEUED
    192.168.1.66:6379> set k2 v2
    QUEUED
    192.168.1.66:6379> set k3 v3
    QUEUED
    192.168.1.66:6379> set k4 v4
    QUEUED
    192.168.1.66:6379> get k2
    QUEUED
    192.168.1.66:6379> EXEC
    1) OK
    2) OK
    3) OK
    4) OK
    5) "v2"
    
    

    好比购物先加入购物车,最后EXEC统一结账。

    192.168.1.66:6379> MULTI
    OK
    192.168.1.66:6379> set k1 11
    QUEUED
    192.168.1.66:6379> set k2 22
    QUEUED
    192.168.1.66:6379> set k3 33
    QUEUED
    192.168.1.66:6379> DISCARD
    OK
    192.168.1.66:6379> get k1 
    "v1"
    
    

    DISCARD 撤销所有操作!

    192.168.1.66:6379> MULTI
    OK
    192.168.1.66:6379> set k1 v1
    QUEUED
    192.168.1.66:6379> set k2 v2
    QUEUED
    192.168.1.66:6379> getset k3
    (error) ERR wrong number of arguments for 'getset' command
    192.168.1.66:6379> set k4 v4
    QUEUED
    192.168.1.66:6379> EXEC
    (error) EXECABORT Transaction discarded because of previous errors.
    
    

    加入时只要有一个出错误,统统的不执行!

    周阳语录:年轻的时候,就是练级打怪的时候,勇敢的上!挑战自己!30以前不要怕,30岁以后不要悔!有机会就跳进去干!

    192.168.1.66:6379> set k1 1
    OK
    192.168.1.66:6379> set k2 2
    OK
    192.168.1.66:6379> set k3 3
    OK
    192.168.1.66:6379> set k4 4
    OK
    192.168.1.66:6379> MULTI
    OK
    192.168.1.66:6379> incr k1 
    QUEUED
    192.168.1.66:6379> decr k2
    QUEUED
    192.168.1.66:6379> EXEC
    1) (integer) 2
    2) (integer) 1
    192.168.1.66:6379> get k1
    "2"
    192.168.1.66:6379> get k2
    "1"
    
    

    k1增加了,k2减小了!通过事物处理,妥妥的不出错!

    192.168.1.66:6379> set k1 v1
    OK
    192.168.1.66:6379> set k2 v2
    OK
    192.168.1.66:6379> set k3 v3
    OK
    192.168.1.66:6379> set k4 v4
    OK
    192.168.1.66:6379> MULTI
    OK
    192.168.1.66:6379> incr k1
    QUEUED
    192.168.1.66:6379> set k2 22
    QUEUED
    192.168.1.66:6379> set k3 33
    QUEUED
    192.168.1.66:6379> set k4 44
    QUEUED
    192.168.1.66:6379> get k4
    QUEUED
    192.168.1.66:6379> EXEC
    1) (error) ERR value is not an integer or out of range
    2) OK
    3) OK
    4) OK
    5) "44"
    

    加入队列时不出错,下面的都将正常运行,执行时出错不影响其他语句!

    Watch监控 重要

    悲观锁、乐观锁、CAS(check and set)

    行锁,表锁,并发性与一致性的对立!表锁,并发性及其差,但是一致性非常好!

    工作中,正常用乐观锁!并发性会更好!

    悲观锁每次拿数据的时候都会上锁(行锁,表锁)。并发性差!

    乐观锁,每次去拿数据不会上锁,但是更新的时候,使用版本号机制。判断一下在此期间别人有没有去更新这个数据。

    乐观锁策略:提交版本必须大于记录当前版本才能执行更新。

    一旦执行了exec之前加的监控锁都会被取消掉!

    Watch指令类似于乐观锁!如果key值已经被客户端改变,整个事务队列都不会被执行!把最新的数据拿下来,再次执行!

    开启,入队,执行。(事务的三个阶段)

  • 相关阅读:
    eclipse中不能找到dubbo.xsd
    CentOS7部署tomcat
    mybatis中的foreach
    mybatis中批量添加orcale
    mybatis中的like使用方式
    mybatis默认参数_parameter和_databaseId
    mybatis中的resultMap
    mybatis操作oracle,插入null值时报错 with jdbctype OTHER
    mybatis 中 #{} 和 ${} 的区别
    mybatis Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/8026783.html
Copyright © 2020-2023  润新知