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 
  • 相关阅读:
    lighting
    移动端
    SVN常见问题
    前四章知识点小结
    如何不运用第三方变量实现两个数的交换
    awk
    sort
    cut
    sed
    30道Linux面试题
  • 原文地址:https://www.cnblogs.com/ngngng/p/13885388.html
Copyright © 2011-2022 走看看