zoukankan      html  css  js  c++  java
  • redis 实现分布式锁

    @RestController
    public class RedisLock {
    @Resource
    RedisTemplate<String, Object> redisTemplate;

    @GetMapping("lock/{key}/{value}")
    public String testLock(@PathVariable String key, @PathVariable String value) {
         // 根据key获取分布式锁,并且设置过期时间

    Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(key, value, 10, TimeUnit.SECONDS);

    if (aBoolean) {
    try {
    System.out.println("获取到锁");
    TimeUnit.SECONDS.sleep(5);
    } catch (InterruptedException e) {
    e.printStackTrace();
    } finally {
    Boolean unlock = unlockLua(key, value);
    System.out.println(unlock);
    }
    } else {
    System.out.println("未获取到锁");
    }
    return "测试锁";
    }

    public boolean unlockLua(String key, String value) {
    DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
    //用于解锁的lua脚本位置
    redisScript.setLocation(new ClassPathResource("unlock.lua"));
    redisScript.setResultType(Long.class);
    //没有指定序列化方式,默认使用上面配置的
    Object result = redisTemplate.execute(redisScript, Collections.singletonList(key), value);
    assert result != null;
    return result.equals(1L);
    }
    //
    在resources中创建 unlock.lua 加入以下代码
    
    
    if redis.call('get',KEYS[1]) == ARGV[1] then
    return redis.call('del',KEYS[1])
    else
    return 0
    end


    }
  • 相关阅读:
    Linux 实战
    bash 环境配置及脚本
    Linux vi/vim
    Linux 正则表达式
    001 KNN分类 最邻近算法
    测序名解
    流式细胞术
    CircRNA 环化RNA
    笔记总结
    Flume
  • 原文地址:https://www.cnblogs.com/bt2882/p/13815342.html
Copyright © 2011-2022 走看看