zoukankan      html  css  js  c++  java
  • redis分布式锁

    1. 分布式锁本质是占一个坑,当别的进程也要来占坑时发现已经被占,就会放弃或者稍后重试

    2. 占坑一般使用 setnx(set if not exists)指令,只允许一个客户端占坑

    3. 先来先占,用完了在调用del指令释放坑


    > setnx lock:codehole true
    .... do something critical ....
    > del lock:codehole

    4. 但是这样有一个问题,如果逻辑执行到中间出现异常,可能导致del指令没有被调用,这样就会陷入死锁,锁永远无法释放

    5. 为了解决死锁问题,我们拿到锁时可以加上一个expire过期时间,这样即使出现异常,当到达过期时间也会自动释放锁


    > setnx lock:codehole true
    > expire lock:codehole 5
    .... do something critical ....
    > del lock:codehole

    6. 这样又有一个问题,setnx和expire是两条指令而不是原子指令,如果两条指令之间进程挂掉依然会出现死锁

    7. 为了治理上面乱象,在redis 2.8中加入了set指令的扩展参数,使setnx和expire指令可以一起执行


    > set lock:codehole true ex 5 nx
    ''' do something '''
    > del lock:codehole 
  • 相关阅读:
    office2007快捷键
    To be solved
    网址Favorites
    C#网址
    developer's website
    Visual Studio快捷键
    如何跟进大客户?
    这些话让我们意识到流程的重要性
    恭祝大家情人节快乐!
    知已知彼,大客户管理10策
  • 原文地址:https://www.cnblogs.com/ngngng/p/13885388.html
Copyright © 2011-2022 走看看