redis分布式锁的代码实现(加入看门狗)

本文介绍了一个使用Jedis库在Java中实现的分布式锁类RedisLock,包括acquireLock获取锁、releaseLock释放锁以及watchdog机制确保锁的持续有效。实例展示了如何在主函数中使用这个锁进行资源保护。
摘要由CSDN通过智能技术生成

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

import java.util.UUID;

public class RedisLock {
private Jedis jedis;
private String lockKey;
private String lockValue;
private int expireTime;
private ThreadLocal lockThreadLocal;
private Thread watchdogThread;

public RedisLock(Jedis jedis, String lockKey, int expireTime) {
    this.jedis = jedis;
    this.lockKey = lockKey;
    this.expireTime = expireTime;
    this.lockThreadLocal = new ThreadLocal<>();
}

public boolean acquireLock() {
    String value = UUID.randomUUID().toString();
    String result = jedis.set(lockKey, value, "NX", "EX", expireTime);
    if ("OK".equals(result)) {
        lockValue = value;
        lockThreadLocal.set(value);
        startWatchdog();
        return true;
    }
    return false;
}

public boolean releaseLock() {
    String value = lockThreadLocal.get();
    if (value != null) {
        Transaction transaction = jedis.multi();
        transaction.watch(lockKey);
        if (value.equals(jedis.get(lockKey))) {
            transaction.del(lockKey);
            transaction.exec();
            lockThreadLocal.remove();
            stopWatchdog();
            return true;
        } else {
            transaction.unwatch();
        }
    }
    return false;
}

private void renewLock() {
    while (lockThreadLocal.get() != null) {
        // 续约锁的有效期
        jedis.expire(lockKey, expireTime);
        try {
            Thread.sleep(expireTime * 1000 / 2); // 续约时间为锁有效期的一半
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

private void startWatchdog() {
    watchdogThread = new Thread(this::renewLock);
    watchdogThread.setDaemon(true);
    watchdogThread.start();
}

private void stopWatchdog() {
    if (watchdogThread != null) {
        watchdogThread.interrupt();
    }
}

}
使用示例:

java
import redis.clients.jedis.Jedis;

public class Main {
public static void main(String[] args) {
Jedis jedis = new Jedis(“localhost”, 6379);
RedisLock lock = new RedisLock(jedis, “my_resource”, 10);
if (lock.acquireLock()) {
try {
// 执行需要加锁的代码
} finally {
lock.releaseLock();
}
}
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值