package com.cf.imes.framework.redis.util;

import cn.hutool.core.util.ObjectUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * redis锁工具类
 *
 * @author Gqr
 * @since 2024/11/8 18:43
 */
@AllArgsConstructor
@Slf4j
public class RedisLockUtil {

    private RedisTemplate redisTemplate;

    /**
     * 手动set nx ex加锁
     * 使用注意：可用于跨服务
     *
     * @param key
     * @param uniqeKey 解锁的时候校验，避免其他任务误解
     * @param timeout
     * @return
     */
    public boolean acquireLock(String key, String uniqeKey, Integer timeout) {
        return redisTemplate.opsForValue().setIfAbsent(key, uniqeKey, timeout, TimeUnit.MILLISECONDS);
    }

    /**
     * 解锁
     * 校验唯一值后删除key
     * 使用注意：可用于跨服务
     *
     * @param key
     * @param uniqeKey 解锁时校验，避免同key下其他任务解锁到
     */
    public void releaseLock(String key, String uniqeKey) {
        Object object = redisTemplate.opsForValue().get(key);
        if (ObjectUtil.equal(object, uniqeKey)) {
            Boolean delete = redisTemplate.delete(key);
            if (delete) {
                log.info(String.format("[RedisLockUtil][unlock][%s]解锁", key));
            } else {
                log.error(String.format("[RedisLockUtil][unlock][%s]解锁失败", key));
            }
        }
    }
}
