专栏首页工作笔记精华Redis实现分布式锁3-使用LUA脚本实现分布式锁,解决原子性问题

Redis实现分布式锁3-使用LUA脚本实现分布式锁,解决原子性问题

private   static   final   Long SUCCESS = 1L;
private   static   String script1 =  "if redis.call('setNx',KEYS[1],ARGV[1])  then "   +
         "   if redis.call('get',KEYS[1])==ARGV[1] then "   +
         "      return redis.call('expire',KEYS[1],ARGV[2]) "   +
         "   else "   +
         "      return 0 "   +
         "   end "   +
         "end" ;
private   RedisScript<String> lockRedisScript1 =  new   DefaultRedisScript<>(script1, String. class );
private   static   String script2 =  "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" ;
private   RedisScript<String> unLockRedisScript =  new   DefaultRedisScript<>(script2, String. class );
/**
  * 获取锁
  *
  * @param lockKey       redis的key
  * @param value         redis的value要求是随机串,防止释放其他请求的锁
  * @param expireTime    redis的key 的过期时间  单位(秒) 防止死锁,导致其他请求无法正常执行业务
  * @return
  */
@Override
public    boolean   lock(String lockKey, String value,  long   expireTime) {
     //对非string类型的序列化
     redisTemplate.setKeySerializer( new   StringRedisSerializer());
     redisTemplate.setValueSerializer( new   StringRedisSerializer());
     Object result = redisTemplate.execute(lockRedisScript1, Collections.singletonList(lockKey), value, String.valueOf(expireTime));
 
     return   SUCCESS.equals(result);
 
}
 
/**
  * 释放锁
  *
  * @param lockKey   redis的key
  * @param value     redis的value  只有value比对一致,才能确定是本请求 加的锁 才能正常释放
  * @return
  */
@Override
public    boolean   unlock(String lockKey, String value) {
     try   {
         Object result = redisTemplate.execute(unLockRedisScript, Collections.singletonList(lockKey), value);
         if   (SUCCESS.equals(result)) {
             return   true ;
         }
     }  catch   (Exception e) {
         e.printStackTrace();
     }
     return   false ;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java对象拷贝最完全解说 转

    java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的:

    stys35
  • flink读取kafka数据并写入HDFS 转

    stys35
  • Redis分布式锁的正确实现方式

    数据库乐观锁 基于Redis的分布式锁 基于Zookeeper的分布式锁 本文介绍的是基于Redis的分布式锁;

    stys35
  • Docker 入门到实战教程(七)安装Redis

    Redis是有状态的,重启容器后数据和配置文件将清空,所以我将采用本地文件挂载方式

    小东啊
  • Git撤销修改、回退版本相关命令

    回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit(代码回滚到上个版本,并提交git)

    JouyPub
  • JS中将变量转为字符串

    译者按: 语言的细枝末节了解一下就可以了,不需要太较真,不过如果一点也不知道的话,那就不太妙了。

    Fundebug
  • 深入Weex系列(九)Weex SDK可借鉴细节总结

    经过前面五篇文章的源码分析及总结,我们对Weex的整体架构及核心源码都有了清晰的认识。本篇文章主要总结我在Weex SDK源码阅读时觉得可以借鉴的细节。

    用户2898788
  • 两种方式解决子集问题

    求集合子集,是回溯算法题中比较经典的题目。类似的题目还有求集合不同的组合等。今天介绍求子集的两种解法。

    用户7685359
  • 高科技来了!玩游戏一样开船的时代来了……

    增强现实(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像的技术,这种技术的目标是在屏幕上把虚拟世界套在现...

    企鹅号小编
  • 详解Android MacAddress 适配心得

    Android 6.0以后 将不再能通过 wifimanager 获取mac,获取到的mac将是固定的:02:00:00:00:00:00 。

    砸漏

扫码关注云+社区

领取腾讯云代金券