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

    Redis分布式锁

    原子操作

    原子操作是指不会被线程调度机制打断的操作。这种操作一旦开始,就会一直运行到结束,中间不会有任何的线程切换。

    原理

    分布式锁本质上要实现的目标就是在Redis里面占一个坑,当别的线程也要来进行占坑的时候,发现已经被别人占用了,只好放弃或者稍后重试。
    占坑使用setnx(set if not exists)指令。使用完成使用del指令释放。

    第一步

    127.0.0.1:6379> setnx mylock true
    (integer) 1

    第二步

    执行某些逻辑操作

    第三步

    127.0.0.1:6379> del mylock
    (integer) 1

    问题1

    在第二步执行逻辑的时候,如果发生异常,那么释放锁的操作就不会被执行,就会造成死锁。

    解决方式

    在拿到锁之后,给锁设置一个过期时间,保证出现异常的时候,锁在一定时间之后自动释放。

    第一步

    127.0.0.1:6379> setnx mylock true
    (integer) 1

    第二步

    127.0.0.1:6379> expire mylock 10
    (integer) 1

    第三步

    执行逻辑操作

    第四步

    127.0.0.1:6379> del mylock
    (integer) 1

    问题2

    如果在setnx和expire之间服务器进程突然挂掉了,就会导致expire命令得不到执行,也会造成死锁。根本原因在于setnx和expire是两条指令而不是一个原子指令。

    解决方式

    在Redis2.8版本中,作者加入了Redis指令的扩展参数,使得setnx和expire指令可以一起执行,彻底解决了分布式锁的乱象。
    127.0.0.1:6379> set mylock true ex 5 nx
    OK
    上面的指令就是setnx指令和expire指令组合在一起的原子指令。

    注意问题

    Redis分布式锁不要用于较长时间的任务。

     

  • 相关阅读:
    开发stark组件
    关于AJAX与form表单提交数据的格式
    博客小项目
    Django Orm 常用字段和参数
    IIS启用兼容模式设置(win2k3—Win7)
    C#调用java类、jar包方法(转)
    解决VML遭遇IE8和XHTML DOCTYPE时不能运行的问题(转)
    Nice Validator(Form验证)及Juery zTree控件
    ASP.NET程序中 抛出"Thread was being aborted. "异常(转)
    SQL语句Where中使用别名作为判断条件
  • 原文地址:https://www.cnblogs.com/beanbag/p/13096596.html
Copyright © 2011-2022 走看看