redis实现分布式锁解析
分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。
1 | package com.example.redis.tool; |
一般情况上述分布式锁已经能满足很多场景了,
但是特殊情况,在 ==if (hasLock) {== 行的时候,系统挂了,那么就死锁了;
原因是加锁的地方不是原子操作。
将代码改进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/**
* 加锁
*
* @param redisTemplate redis连接
* @param lockKey 锁名称
* @param retry 从试次数
* @param requestId 请求id
* @param expire 过期时间 单位s
* @return
*/
public static boolean lock(RedisTemplate redisTemplate, String lockKey, Integer retry, String requestId, int expire) {
int i = 0;
while (true) {
try {
RedisCallback<String> stringRedisCallback = new RedisCallback() {
public Object doInRedis(RedisConnection redisConnection) {
JedisCommands nativeConnection = (JedisCommands) redisConnection.getNativeConnection();
return nativeConnection.set(lockKey, requestId, "NX", "PX", expire);
}
};
String execute = (String) redisTemplate.execute(stringRedisCallback);
return !execute.isEmpty();
} catch (Exception e) {
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
i++;
if (i > retry) {
return false;
}
}
}
问题
1、锁过期了业务还没有完成怎么办?
目前只能通过对业务的测试,找到一个最大的业务执行时间,然后设置一个最大的业务执行时间。

