• redis--悲观锁、乐观锁


    悲观锁:

        很悲观、认为什么时候都会出问题、无论做什么都加锁、很影响性能

    乐观锁: 

        1.很乐观、认为什么时候都不会出问题、所以不上锁。更新数据的时候去判断下,在此期间是否有人修改这个数据。

        2.获取version

        3.更新时比较version

    watch (监控、实现乐观锁)

    监控测试、正常执行:

    my-redis:0>set money 100  ##########  设置余额 100
    OK
    
    my-redis:0>set out 0    #######  设置花费  0
    OK
    
    my-redis:0>watch money  #####  watch  监控 余额
    OK
    
    
    my-redis:0>multi  ##########  开启事务
    OK
    
    my-redis:0>decrby money 20   #######  余额 -20
    QUEUED
    
    my-redis:0>incrby out 20  ######## 花费 +20
    QUEUED
    
    my-redis:0>exec  ########  执行事务
    80
    20
    
    my-redis:0>get money  ############  正常 !数据期间没有发生变动,这个时候就正常执行成功
    80
    
    my-redis:0>     

    测试多线程修复值、使用乐观锁操作。(事务没执行、执行前另一个线程改了余额、监控的值发生变化、这时执行事务会失败)

    my-redis:0>get money  ####  获取到余额是80
    80
    
    my-redis:0>watch money  ##### 监控余额
    OK
    
    my-redis:0>multi  #######开启事务  (这时候另一个线程把余额改成1000)
    OK
    
    my-redis:0>decrby money 10  ########余额-10   
    QUEUED
    
    my-redis:0>incrby out 10  ########### 花费+10
    QUEUED
    
    my-redis:0>exec  #########  执行事务失败,因为监控的余额在执行之前已经被改了
    null

    怎么解决:在事务执行失败后,解锁 unwatch ,2.再重新获取锁,执行 提交

    my-redis:0>unwatch  #########解锁
    OK
    
    my-redis:0>watch money  ######重新获取锁 监控
    OK
    
    my-redis:0>multi  ########开启事务
    OK
    
    my-redis:0>decrby money 10
    QUEUED
    
    my-redis:0>incrby out 10
    QUEUED
    
    my-redis:0>exec  #########执行成功
    990
    30
  • 相关阅读:
    linux 安装jdk
    linux 安装 Redis
    jvisualvm监控远程jvm的两种连接方式
    list转map(JDK8-Lambda表达式)
    循环删除list中的某一元素的三种方式
    SpringBoot-@ControllerAdvice 拦截异常并统一处理
    Spring-@ControllerAdvice 拦截异常并统一处理
    Tomcat系列
    thinkPHP5.1模型User设计
    uniapp后台api设计(微信user表)
  • 原文地址:https://www.cnblogs.com/cx-code/p/13246869.html
Copyright © 2020-2023  润新知