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

     

    一、分布式锁的实现方式

    分布式锁一般有三种实现方式:
        1. 数据库乐观锁;
        2. 基于Redis的分布式锁;
        3. 基于ZooKeeper的分布式锁;

    二、锁的四要素

        1.互斥性。在任意时刻,只有一个客户端能持有锁。
        2.不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
        3.具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。
        4.解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。

    三、Redis分布式锁的实现

    加锁:

    1.正确姿势:

    String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
    "OK".equal(result);//成功时返回OK

    2.错误使用:
    使用setnx & expire
    。。。

    解锁:

    1.正确姿势:(将Lua代码传到jedis.eval()方法)

    String script = "if redis.call('get', KEYS[1]) == ARGV[1] " 
        + "then return redis.call('del', KEYS[1]) else return 0 end";
    Object result = jedis.eval(script, Collections.singletonList(lockKey), 
        Collections.singletonList(requestId));
    Long.valueOf(1L).equal(result);//成功时返回1

    执行eval()方法可以确保原子性,源于Redis的特性;
    官网解释:
        在eval命令执行Lua代码的时候,Lua代码将被当成一个命令去执行,并且直到eval命令执行完成,Redis才会执行其他命令;

    2.错误使用
    直接del 或者 requestId比较后删除del

    分布式锁实现:https://xiaozhuanlan.com/topic/4672859130

     
  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/itommy/p/10644552.html
Copyright © 2011-2022 走看看