CommonRedisHelper.java
2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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));
// }
}