ZBLOG

redis 实现并发锁 给我java demo

以下是使用 Redis 实现并发锁的 Java 示例代码:

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

public class RedisLock {

    private Jedis jedis;
    private String lockKey;
    private int expireTime = 30; // 锁过期时间,默认为30秒
    private boolean locked = false;

    public RedisLock(Jedis jedis, String lockKey) {
        this.jedis = jedis;
        this.lockKey = lockKey;
    }

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

    public boolean acquire() {
        long nowTime = System.currentTimeMillis();
        long expireTime = nowTime + this.expireTime * 1000 + 1;
        String expireTimeStr = String.valueOf(expireTime);

        SetParams params = new SetParams();
        params.nx().px(this.expireTime * 1000);

        String result = jedis.set(lockKey, expireTimeStr, params);

        if ("OK".equals(result)) {
            locked = true;
            return true;
        } else {
            return false;
        }
    }

    public void release() {
        if (locked) {
            jedis.del(lockKey);
            locked = false;
        }
    }
}

使用示例:

Jedis jedis = new Jedis("localhost", 6379);
RedisLock lock = new RedisLock(jedis, "mylock");

try {
    if (lock.acquire()) {
        // 获得锁成功,执行业务逻辑
    }
} finally {
    lock.release();
}

在上面的示例中,我们定义了一个 RedisLock 类,它包含了 Redis 连接、锁的键名、锁的过期时间和一个标志位 locked。其中 acquire() 方法用于获取锁,如果成功则返回 true;release() 方法用于释放锁。

acquire() 方法中,我们首先获取当前时间戳和锁的过期时间,然后使用 SETNX 命令尝试获取锁,同时设定锁的过期时间。如果返回值是 “OK”,说明获取锁成功;否则说明锁已经被其他进程占用,获取锁失败。

release() 方法中,我们只需要使用 DEL 命令删除锁的键即可。注意要判断 locked 标志位是否为true,以避免重复释放锁。

以上示例代码只是一个简单的实现,还有很多细节需要注意,比如加锁和释放锁的顺序、锁的粒度等问题,需要根据具体业务场景进行调整。

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?