美文网首页
分布锁(Redis+lua)

分布锁(Redis+lua)

作者: 超人001 | 来源:发表于2021-04-29 17:56 被阅读0次

上锁

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

public static boolean lock(String key,String lockValue,int expire){
      if(null == key){
          return false;
      }
      try {
          Jedis jedis = getJedisPool().getResource();
          String res = jedis.set(key,lockValue,"NX","EX",expire);
          jedis.close();
          return res!=null && res.equals("OK");
      } catch (Exception e) {
          return false;
      }
  }

lua脚本

if redis.call('get', KEYS[1]) == ARGV[1] 
    then 
        return redis.call('del', KEYS[1]) 
    else 
        return 0 
end

释放锁

private static final Long lockReleaseOK = 1L;
static String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";// lua脚本,用来释放分布式锁
 
public static boolean releaseLock(String key ,String lockValue){
    if(key == null || lockValue == null) {
        return false;
    }
    try {
        Jedis jedis = getJedisPool().getResource();
        Object res =jedis.eval(luaScript,Collections.singletonList(key),Collections.singletonList(lockValue));
        jedis.close();
        return res!=null && res.equals(lockReleaseOK);
    } catch (Exception e) {
        return false;
    }
}

unLock.lua脚本文件

local lockkey = KEYS[1]
--唯一随机数
local uid = KEYS[2]
--失效时间,如果是当前线程,也是续期时间
local time = KEYS[3]

if redis.call('set',lockkey,uid,'nx','px',time)=='OK' then
return 'OK'
else
    if redis.call('get',lockkey) == uid then
       if redis.call('EXPIRE',lockkey,time/1000)==1 then
       return 'OOKK'
       end
    end
end

java 调用脚本文件

  public void luaUnLock() throws Exception{
        Jedis jedis = new Jedis("localhost") ;
        InputStream input = new FileInputStream("unLock.lua");
        byte[] by = new byte[input.available()];
        input.read(by);
        String script = new String(by);
        Object obj = jedis.eval(script, Arrays.asList("key","123"), Arrays.asList(""));
        System.out.println("执行结果 " + obj);
    }

main方法操作

lock("item-01","1",20000);
Thread.sleep(2000);
releaseLock("item-01","1");

相关文章

  • 分布锁(Redis+lua)

    上锁 EX second :设置键的过期时间为 second 秒。 SET key value EX second...

  • 分布式锁的实例应用

    前篇:Redis+Lua实现分布式锁 场景描述: 更新一个页面信息,首先更新页面在导航中的信息,然后删除页面下所有...

  • redis+Lua实现分布式锁

    1.方法lock(String lock, int expire):获取锁 expire,锁的过期时间 setnx...

  • redis+lua实现分布式锁

  • Redis第四天

    Redis+Lua语言限流实战 Redis+LUA语言限流流程图 Redis+Lua语言抢红包实战

  • 分布式锁

    为什么要用分布式锁 数据库乐观锁redis分布式锁zookeeper分布式锁 使用分布式锁的场景 实现分布式锁的方...

  • 大佬浅谈分布式锁

    redis 实现 redis 分布锁一、redis 实现分布式锁(可重入锁)redission 实现分布式锁1、对...

  • 什么是分布式锁?几种分布式锁分别是怎么实现的?

    一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资...

  • Redis+Lua实现限流

    分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使使用redis+lua或者nginx+lua技术进行实...

  • 分布式限流之Redis+Lua实现

    分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使用redis+lua或者nginx+lua技术进行实现...

网友评论

      本文标题:分布锁(Redis+lua)

      本文链接:https://www.haomeiwen.com/subject/hcucrltx.html