欢迎访问我的个人网站==》 jiashubing.cn

redis锁简单实现

不要用get,get的话有可能并发

使用 setnx ex 

NX :只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。
EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。

Boolean flag = jedisTemplate.setnxex(REDIS_LOCK_KEY, "1", 60);
if (!flag) {
    // 此时其他的服务器正在执行该任务
    return;
}

 

也可以使用如下代码封装一下:

import redis.clients.jedis.Jedis;

public class RedisLock {
    private final Jedis jedis;
    private final String lockKey;
    private final int expireTime = 60; // 锁的过期时间,单位:秒

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

    /**
     * 尝试获取锁
     * @return true-获取锁成功,false-获取锁失败
     */
    public boolean tryLock() {
        String result = jedis.set(lockKey, "lock_value", "NX", "EX", expireTime);
        return result != null && result.equals("OK");
    }

    /**
     * 释放锁
     */
    public void unlock() {
        jedis.del(lockKey);
    }
}

 

posted @ 2023-09-28 16:32  贾树丙  阅读(21)  评论(0编辑  收藏  举报