zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    c# 菱形,三角形
    c#判断一个时间的时间段
    c# 1,判断是否为正整数 2 判断体重
    数据库 基础
    c#100 计算行李重量
    c#基础 1,100以内的与7相关的数字;2,计算器,
    String 类;Math 类
    常用的C#类
    冒泡排序与快速排序
    数据库基本知识
  • 原文地址:https://www.cnblogs.com/cx-code/p/13246869.html
Copyright © 2011-2022 走看看