ZBLOG

redis 分布式锁 请给出java代码

下面是一个简单的基于Redis实现的分布式锁Java代码示例:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;

public class DistributedLock {
    private final Jedis jedis;
    private final String lockKey;
    private final String lockValue;
    private final int expireTime; // 锁过期时间,单位:秒

    public DistributedLock(Jedis jedis, String lockKey, String lockValue, int expireTime) {
        this.jedis = jedis;
        this.lockKey = lockKey;
        this.lockValue = lockValue;
        this.expireTime = expireTime;
    }

    public boolean tryLock() {
        SetParams params = new SetParams();
        params.nx(); // 只有键不存在时才设置值
        params.ex(expireTime); // 设置过期时间,防止死锁

        String result = jedis.set(lockKey, lockValue, params);
        return "OK".equals(result);
    }

    public boolean releaseLock() {
        // Redis不支持原子删除带有特定值的键,需要使用Lua脚本来实现
        String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
        return (Long) result == 1L;
    }
}

使用示例:

Jedis jedis = new Jedis("localhost", 6379); // 连接到Redis服务器
DistributedLock lock = new DistributedLock(jedis, "my-lock", "my-value", 30); // 创建分布式锁
if (lock.tryLock()) { // 尝试获取锁
    try {
        // 执行需要加锁的代码,同一时刻只能有一个线程执行该代码
    } finally {
        lock.releaseLock(); // 释放锁
    }
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=405

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?