基于Jedis/Redisson的分布式锁实现

  1. Jedis分布式锁

引入依赖
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.0.1</version>
</dependency>
加锁代码块
/**
* lockKey表示加锁的名称。
* requestId是一个随机值,作为解锁的依据,解锁时校验下该值是否和客户端传过来的值一致才可以删除该锁
* NX,意思是SET IF NOT EXIST,即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作;
* PX,意思是我们要给这个key加一个过期的设置,具体时间由expireTime决定。
* expireTime,与PX对应,代表key的过期时间。
*/
jedis.set(lockKey, requestId, "NX", "PX", expireTime);

解锁代码块
/**
* lua脚本
* 其中KEYS[1] 是lockKey,ARGV[1]是requestId;
* 脚本意思就是:从redis根据lockKey获取缓存的值,与入参的requestId是否一致,一致就删除。
/
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";

// 执行lua脚本
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

// 成功返回
if ("OK".equals(result)) {
    return true;
}
// 失败返回
return false;
  1. Redisson分布式锁

引入依赖
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.10.1</version>
</dependency>
加锁/解锁 代码块
    final RedissonClient client = Redisson.create(config);  
    RLock lock = client.getLock("lock1");
    // 用法与ReentrantLock重入锁类似
    try{
        lock.lock();
    }finally{
        lock.unlock();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值