• redis实现分布式锁


    基于 redis 的 setnx()、get()、getset()方法做分布式锁

    • setnx() setnx 的含义就是 SET if Not Exists,其主要有两个参数 setnx(key, value)。该方法是原子的,如果 key 不存在,则设置当前 key 成功,返回 1;如果当前 key 已经存在,则设置当前 key 失败,返回 0。
    •  getset() 这个命令主要有两个参数 getset(key,newValue)。该方法是原子的,对 key 设置 newValue 这个值,并且返回 key 原来的旧值。假设 key 原来是不存在的,那么多次执行这个命令,会出现下边的效果: getset(key, “value1”) 返回 null此时 key 的值会被设置为 value1 getset(key, “value2”) 返回 value1 此时 key 的值会被设置为 value2 依次类推!

    使用步骤

    • setnx(lockkey, 当前时间+过期超时时间),如果返回 1,则获取锁成功;如果返回 0 则没有获取到锁,转向2。
    • get(lockkey) 获取值 oldExpireTime ,并将这个 value 值与当前的系统时间进行比较,如果小于当前系统时间,则认为这个锁已经超时,可以允许别的请求重新获取,转向 3。
    • 计算 newExpireTime = 当前时间+过期超时时间,然后 getset(lockkey, newExpireTime) 会返回当前 lockkey的值currentExpireTime。
    • 判断 currentExpireTime 与 oldExpireTime 是否相等,如果相等,说明当前 getset 设置成功,获取到了锁。如果不相等,说明这个锁又被别的请求获取走了,那么当前请求可以直接返回失败,或者继续重试。
    • 在获取到锁之后,当前线程可以开始自己的业务处理,当处理完毕后,比较自己的处理时间和对于锁设置的超时时间,如果小于锁设置的超时时间,则直接执行 delete 释放锁;如果大于锁设置的超时时间,则不需要再锁进行处

     

  • 相关阅读:
    Mahout机器学习平台之聚类算法具体剖析(含实例分析)
    算法导论 动态规划 钢条分割问题的自底向上解法
    玩转Linux网络namespace-单机自环測试与策略路由
    Unity KillCount
    android 项目中使用到的网络请求框架以及怎样配置好接口URL
    Gradle 1.12 翻译——第十四章. 教程
    MySQL 性能优化
    Git教程
    Eclipse常用小知识汇总
    自定义全局异常捕获
  • 原文地址:https://www.cnblogs.com/blog-cq/p/14032185.html
Copyright © 2020-2023  润新知