CommonRedisHelper.java 2.75 KB
package com.bootdo.common.utils;

import java.util.Objects;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class CommonRedisHelper {


	 
    public static final String LOCK_PREFIX = "redis_lock_saas_cso_job";
    public static final int LOCK_EXPIRE = 1000*30; // ms 此处默认设置为30秒
 
    @SuppressWarnings("rawtypes")
    @Autowired
    private RedisTemplate redisTemplate;
 
   
    /**
     * 分布式锁
     * 如果锁持有者,在超时时间之后都没有释放锁(死锁),那么后续拿锁一样会成功
     * @param key 键
     * @param lockExpire   超时时间(单位毫秒)
     * @return
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
	public boolean lock(String key,int lockExpire){
        String lock = LOCK_PREFIX + key;
        // 利用lambda表达式
        return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
            long expireAt = System.currentTimeMillis() + lockExpire + 1;
            Boolean acquire = connection.setNX(lock.getBytes(), String.valueOf(expireAt).getBytes());
            
            if (acquire) {
                return true;
            } else {
 
                byte[] value = connection.get(lock.getBytes());
 
                if (Objects.nonNull(value) && value.length > 0) {
                    long expireTime = Long.parseLong(new String(value));
                    if (expireTime < System.currentTimeMillis()) {
                        // 如果锁已经过期
                        byte[] oldValue = connection.getSet(lock.getBytes(), String.valueOf(System.currentTimeMillis() + lockExpire + 1).getBytes());
                        // 防止死锁
                        return Long.parseLong(new String(oldValue)) < System.currentTimeMillis();
                    }
                }
            }
            return false;
        });
    }
 
    /**
     * 删除锁
     *
     * @param key
     */
    @SuppressWarnings("unchecked")
	public void delete(String key) {
        redisTemplate.delete(LOCK_PREFIX + key);
    }
    
    
//    public static void main(String[] args) throws InterruptedException {
//    	
//    	System.out.println(new String(String.valueOf(System.currentTimeMillis() + LOCK_EXPIRE + 1).getBytes()));
//    	Thread.sleep(3000);
//    	byte [] ss = String.valueOf(System.currentTimeMillis() + LOCK_EXPIRE + 1).getBytes();
//    	System.out.println(ss);
//    	String value =new String(ss);
//    	System.out.println(value);
//    	System.out.println(Long.parseLong(value));
//	}
}