美文网首页
分布式锁学习

分布式锁学习

作者: hvne666 | 来源:发表于2018-10-24 13:52 被阅读24次
  • 数据库
  • redis
  • zookeeper

znode四种类型:

  • 持久节点 (PERSISTENT)
  • 持久顺序节点(PERSISTENT_SEQUENTIAL)
  • 临时节点(EPHEMERAL)
  • 临时顺序节点(EPHEMERAL_SEQUENTIAL)

zookeeper

创建一个持久节点,在这个节点下创建临时顺序节点,如果顺序是第一个,就获取锁;
如果不是第一个,就监听前面一个节点的状态


zk获取锁过程.png

redis

加锁:

String threadId = Thread.currentThread().getId()
set(key,threadId ,30,NX)

解锁:

if(threadId .equals(redisClient.get(key))){    
    del(key)}

释放锁:判断和释放锁是两个独立操作,不是原子性,可以用lua脚本解决。

public class JedisDtLock extends JedisBase implements DtLock {

    private static final String LOCK_SUCCESS         = "OK";
    private static final String SET_IF_NOT_EXIST     = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";
    private static final int    DEFAULT_OWN_TIMEOUT  = 30;

    /**
     * 锁失效超时时间,单位:毫秒
     */
    private int ownTimeoutSecond = DEFAULT_OWN_TIMEOUT;

    public JedisDtLock(String name) {
        setKeyName(name + ":DtLock");
    }

    @Override
    public String tryLock() {
        String kId = UuidUtil.uuid();
        String result = getJedis().set(getKeyName(), kId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME,
                                       ownTimeoutSecond * 1000);
        return LOCK_SUCCESS.equals(result) ? kId : null;
    }

    @Override
    public void unLock(String kId) {
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return "
                        + "0 end";
        getJedis().eval(script, Collections.singletonList(getKeyName()), Collections.singletonList(kId));
    }

    public int getOwnTimeoutSecond() {
        return ownTimeoutSecond;
    }

    public void setOwnTimeoutSecond(int ownTimeoutSecond) {
        this.ownTimeoutSecond = ownTimeoutSecond;
    }
}

from:https://gitee.com/xuan698400/distributed-tool

相关文章

  • 分布式锁

    为什么要用分布式锁 数据库乐观锁redis分布式锁zookeeper分布式锁 使用分布式锁的场景 实现分布式锁的方...

  • 分布式锁实现-ZooKeeper方式

    如何用Zookeeper实现分布式锁? 在学习分布式锁之前,需要首先了解一下Zookeeper的[临时顺序节点]。...

  • 什么是分布式锁?几种分布式锁分别是怎么实现的?

    推荐学习 分布式-全家桶(面试+技术):分布式锁+分布式事务+分布式缓存,redis+zk+nginx+mq+ka...

  • 什么是分布式锁?几种分布式锁分别是怎么实现的?

    一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资...

  • 4:Redis 分布式锁 (文末有项目连接)

    1:什么是缓存分布式锁 2:分布式锁的关键代码 3:业务代码使用分布式缓存锁 4:业务代码使用分布式缓存锁 5:测...

  • 锁(2)-- 分布式锁

    前言: 锁分3种:java锁、分布式锁、DB锁 分布式锁的几种实现方式 目前几乎很多大型网站及应用都是分布式部署...

  • java锁的概念

    参考文档探究分布式并发锁并发编程-锁的发展和主流分布式锁比较总结从构建分布式秒杀系统聊聊分布式锁探索并发编程(六)...

  • Redis实现分布式锁

    分布式下的分布式锁一般实现有三种: 基于数据库的乐观锁 基于redis的分布式锁 基于zookeeper的分布式锁...

  • 分布式锁

    为什么要用分布式锁? 分布式锁是悲观锁的实现; 如果采用乐观锁的方案就用不着分布式锁了。 能用乐观锁的地方尽量用乐...

  • java分布式,最终一致性,java幂等问题分析

    分布式学习: 分布式常用的分布式事务解决方案介绍有多少种?基于 Redis 的分布式锁分布式简介关于分布式事务、两...

网友评论

      本文标题:分布式锁学习

      本文链接:https://www.haomeiwen.com/subject/yomttqtx.html