`
amu123456
  • 浏览: 9203 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

DistributedLock

    博客分类:
  • WEB
阅读更多
private volatile String unlockSha1 = "";
public String lock(String lockName, long acquireTime, int lockTimeout) {
        String identifier = UuidUtil.generate32Value();
        String lock = "lock:" + lockName;
        long beginTime = System.currentTimeMillis();
        do {
            String result = jedisCluster.set(lock, identifier, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, lockTimeout);
            if (LOCK_SUCCESS.equalsIgnoreCase(result)) {
                return identifier;
            }

            try {
                TimeUnit.MILLISECONDS.sleep(10);
            } catch (InterruptedException e) {
                log.error("acquireDistributedLock error:",e);
            }
        } while (System.currentTimeMillis() - beginTime < acquireTime);

        return null;
    }
//identifier 为lock返回值
public boolean releaseDistributedLock(String lockName, String identifier) {
        String lock = "lock:" + lockName;
        List<String> keys = Collections.singletonList(lock);
        List<String> args = Collections.singletonList(identifier);
        try {
            Object result = jedisCluster.evalsha(unlockSha1, keys, args);
            return RELEASE_SUCCESS.equals(result);
        } catch (JedisNoScriptException e) {
            //没有脚本缓存时,重新发送缓存
            log.info("try to store script......");
            storeScript(lock);
            Object result = jedisCluster.evalsha(unlockSha1, keys, args);
            return RELEASE_SUCCESS.equals(result);
        } catch (Exception e){
            log.error("releaseDistributedLock error:",e);
            return false;
        }
    }

private void storeScript(String lock){
        if (StringUtil.isEmpty(unlockSha1) || !jedisCluster.scriptExists(unlockSha1, lock)){
            //redis支持脚本缓存,返回哈希码,后续可以继续用来调用脚本
            unlockSha1 = jedisCluster.scriptLoad(DEL_SCRIPT, lock);
        }
    }
分享到:
评论

相关推荐

    PyPI 官网下载 | django-distributedlock-0.4.0.tar.gz

    《Django分布式锁库django-distributedlock的深度解析》 在Python后端开发领域,Django框架因其高效、稳定及强大的功能而广受开发者青睐。然而,在多线程或多进程环境中,为了保证数据的一致性和安全性,我们经常...

    DistributedLock.java

    DistributedLock.java

    DistributedLock-master.zip

    标题"DistributedLock-master.zip"暗示了这是一个关于`.netCore`实现分布式锁的项目源代码,可能包含一个或多个实现分布式锁解决方案的类库或示例。通过在GitHub上搜索并下载这个项目,你可以深入理解如何在`....

    DistributedLock:用于分布式同步的.NET库

    分布式锁DistributedLock是一个.NET库,它基于各种基础技术提供了健壮且易于使用的分布式互斥锁,读写器锁和信号灯。 使用DistributedLock,跨多个应用程序/机器同步对代码区域的访问非常简单: using ( await ...

    DistributedLock:redis分布式锁

    在这个名为 "DistributedLock:redis分布式锁" 的项目中,我们可以探讨以下几个关键知识点: 1. **分布式锁的概念**:在分布式系统中,当多个节点需要并发访问共享资源时,为了避免数据不一致性和竞态条件,需要一种...

    DistributedLock:使用Redis的分布式锁

    克隆包含`DistributedLock`项目的存储库后,运行其中的单元测试可以验证分布式锁的正确性。 总结,使用Redis作为分布式锁是解决分布式系统中资源同步问题的有效方法。通过Java中的Jedis客户端,我们可以方便地实现...

    distributedlock.rar

    Zookeeper 非公平锁/公平锁/共享锁demo代码

    DistributedLocking:分布式锁定C#库

    分布式锁定 分布式锁的简单C#实现,可以在专注于可扩展性的多客户端(流程)环境中使用。快速开始该库旨在通过抽象使用,因此,无论选择哪种...var distributedLock = await provider . TryAcquireAsync ( resourceI

    distributed-lock:三种方式实现分布式锁

    String lockKey = "distributedLock"; if (redisTemplate.opsForValue().setIfAbsent(lockKey, "lock")) { // 获取锁成功,执行业务逻辑 } else { // 获取锁失败,处理等待或回滚等逻辑 } ``` 这种方法简单易行,...

    记录redisson实现redis分布式事务锁

    public Object lock(ProceedingJoinPoint joinPoint, DistributedLock distributedLock) throws Throwable { RLock lock = redissonClient.getLock(distributedLock.key()); try { if (distributedLock.waitTime...

    lock4j-master.zip

    1. 声明式锁:Lock4j 提供了注解 `@DistributedLock`,可以直接在方法上进行标注,实现自动加锁和解锁。这使得开发者无需在业务代码中处理锁的细节,提高了代码的可读性和可维护性。 2. 编程式锁:对于更复杂的需求...

    redis-lock-master.zip

    import com.example.springbootdemo.commons.lock.DistributedLock; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.spring...

    java7源码-distributed-lock:分布式锁

    java7 源码 现在面试都会聊聊分布式系统,通常面试官都会从服务框架(Spring Cloud、Dubbo),一路聊到分布式事务、分布式锁、ZooKeeper等知识。今天就来聊聊分布式锁这块的知识,先具体的来看看Redis分布式锁的实现...

    用注解实现redis分布式锁,防止短时间内重复请求

    public Object around(ProceedingJoinPoint joinPoint, DistributedLock distributedLock) throws Throwable { String lockKey = distributedLock.key(); // 获取锁 if (!redisTemplate.opsForValue()....

    distributed_lock:分布式锁

    分布式锁分布式锁:使用mysql和zookeeper实现mysql_lock.py:Mysql 分布式锁zk_lock.py:zookeeper 分布式锁(需要 python 模块 'kazoo') test_mysql_lock.py:测试Mysql分布式锁test_zookeeper_lock.py:测试...

    distributed-lock:使用Spring的分布式锁定

    分布式锁分布式锁定可确保您的方法无法从多个JVM(服务器,微服务集群等)并行运行。 它使用公用存储来跟踪已使用的锁,并且您的方法需要获取一个或多个锁才能运行。 默认情况下,锁遵循方法的生命周期,它们是在...

    分布式锁和信号量的基本概念以及一些简单的例子.rar

    分布式锁(Distributed Lock) 分布式锁是一种在分布式系统中确保多个进程或节点对共享资源的互斥访问的机制。一个常见的实现是使用基于Redis的分布式锁。 Redis分布式锁的例子(使用Redisson客户端) Redisson是一...

    SnowJena:Distributed lock-free current limiting framework based on token bucket algorithm.基于令牌桶算法实现的分布式无锁限流框架

    :heart_with_ribbon:SnowJena What 基于令牌桶算法实现的分布式无锁限流框架,支持动态配置规则,支持可视化监控,开箱即用。 Document 使用文档:| 功能概要 限流 降级 授权 ... Logger logger = LoggerFactory.getLog

    基于redis分布式锁实现“秒杀”

    DistributedLock lock = new DistributedLock(jedis); String lockKey = "product_id_" + productId; int lockExpireTime = 60; // 单位:秒 if (lock.tryLock(lockKey, lockExpireTime)) { try { // 执行秒杀业务...

    redisson实现分布式锁

    在分布式锁场景中,我们可以通过自定义注解,比如`@DistributedLock`,并在需要加锁的方法上使用这个注解,然后编写一个切面来处理这个注解,实现在方法执行前获取锁,执行后释放锁的过程。 具体实现步骤如下: 1....

Global site tag (gtag.js) - Google Analytics