Skip to content

Commit 9b23296

Browse files
author
悟空
committed
update redis lock
1 parent c657357 commit 9b23296

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

README.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,18 @@ Windows 版正在更新中,可参考 Mac 版的部署教程。
1313

1414
前后端都在这个仓库:
1515

16-
后台代码地址:https://github.com/Jackson0714/PassJava-Platform
1716

18-
-> [后端部署教程](http://www.passjava.cn/#/01.项目简介/7.本地部署项目Mac版)
17+
- 后台代码地址:https://github.com/Jackson0714/PassJava-Platform
1918

20-
前端 Vue 代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal
19+
:heavy_check_mark: [后端部署教程](http://www.passjava.cn/#/01.项目简介/7.本地部署项目Mac版)
2120

22-
-> [前端部署教程](https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal)
21+
- 前端 Vue 代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal
2322

24-
小程序代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-miniApp
23+
:heavy_check_mark: [前端部署教程](https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal)
2524

26-
-> [小程序部署教程](https://github.com/Jackson0714/PassJava-Platform/blob/master/passjava-miniApp/README.md)
25+
- 小程序代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-miniApp
26+
27+
:heavy_check_mark: [小程序部署教程](https://github.com/Jackson0714/PassJava-Platform/blob/master/passjava-miniApp/README.md)
2728

2829
## 简介
2930

passjava-question/src/main/java/com/jackson0714/passjava/question/service/impl/TypeServiceImpl.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
import org.springframework.beans.factory.annotation.Autowired;
77
import org.springframework.data.redis.core.StringRedisTemplate;
88
import org.springframework.data.redis.core.ValueOperations;
9+
import org.springframework.data.redis.core.script.DefaultRedisScript;
910
import org.springframework.stereotype.Service;
1011

12+
import java.util.Arrays;
1113
import java.util.List;
1214
import java.util.Map;
15+
import java.util.UUID;
1316
import java.util.concurrent.TimeUnit;
1417

1518
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -99,17 +102,26 @@ private List<TypeEntity> getDataFromDB() {
99102

100103
@Override
101104
public List<TypeEntity> getTypeEntityListByRedisDistributedLock() throws InterruptedException {
102-
// 1.先抢占锁
103-
Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", "123");
105+
// 1.生成唯一 id
106+
String uuid = UUID.randomUUID().toString();
107+
// 2. 抢占锁
108+
Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 10, TimeUnit.SECONDS);
104109
if(lock) {
105-
// 2.抢占成功,执行业务
110+
System.out.println("抢占成功:" + uuid);
111+
// 3.抢占成功,执行业务
106112
List<TypeEntity> typeEntityListFromDb = getDataFromDB();
107-
// 3.解锁
108-
redisTemplate.delete("lock");
113+
114+
// 4.Lua 脚本解锁
115+
String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";
116+
redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Arrays.asList("lock"), uuid);
117+
118+
System.out.println("解锁成功:" + uuid);
119+
109120
return typeEntityListFromDb;
110121
} else {
122+
System.out.println("抢占失败,等待锁释放");
111123
// 4.休眠一段时间
112-
//sleep(100);
124+
sleep(100);
113125
// 5.抢占失败,等待锁释放
114126
return getTypeEntityListByRedisDistributedLock();
115127
}

0 commit comments

Comments
 (0)