微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于Redis setNX命令实现分布式加解锁

1、setNX命令说明:
SET resource_name my_random_value NX PX 30000
2、代码演示:
@Service
public class BaseSetNXdistributeLockService {

    private static final Logger LOGGER = LoggerFactory.getLogger(BaseSetNXdistributeLockService.class);

    @Autowired
    private Redistemplate redistemplate;

    public String redisLock() {
        LOGGER.info("我进入了方法!");
        String key = "redisKey";
        String value = UUID.randomUUID().toString();

        RedisCallback<Boolean> redisCallback = connection -> {
            //设置NX
            RedisStringCommands.Setoption setoption = RedisStringCommands.Setoption.ifAbsent();
            //设置过期时间
            Expiration expiration = Expiration.seconds(30);
            //序列化key
            byte[] redisKey = redistemplate.getKeySerializer().serialize(key);
            //序列化value
            byte[] redisValue = redistemplate.getValueSerializer().serialize(value);
            //执行setnx操作
            Boolean result = connection.set(redisKey, redisValue, expiration, setoption);
            return result;
        };
        //获取分布式锁
        Boolean lock = (Boolean) redistemplate.execute(redisCallback);
        if (lock) {
            LOGGER.info("我进入了锁!");
            try {
                Thread.sleep(15000);
            } catch (InterruptedException e) {
                e.printstacktrace();
            } finally {
                String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n"+
                        "  return redis.call(\"del\",KEYS[1])\n"+
                        "else\n"+
                        "  return 0\n"+
                        "end";
                RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
                List<String> keys = Arrays.asList(key);
                Boolean result = (Boolean) redistemplate.execute(redisScript,keys,value);
                LOGGER.info("释放锁的结果:"+result);

                
            }
        }
        return "方法执行完成!";
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐