Skip to content

Commit a32cfee

Browse files
committed
snowalker-push version 1.0.0
1 parent a15624f commit a32cfee

File tree

71 files changed

+2927
-2
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+2927
-2
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
*.zip
1919
*.tar.gz
2020
*.rar
21-
21+
.idea
22+
/target/*
23+
*.iml
2224
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
2325
hs_err_pid*

README.md

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,85 @@
11
# redis-distributed-lock
2-
redis分布式锁工具包,提供纯Java方式调用,支持传统Spring工程, 为spring boot应用提供了starter,更方便快捷的调用。
2+
> redis分布式锁工具包,提供纯Java方式调用,支持传统Spring工程,
3+
> 为spring boot应用提供了starter,更方便快捷的调用。
4+
## 项目结构
5+
6+
[redis-distributed-lock-core](http://wuwenliang.net/2018/07/08/%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E7%9A%84%E5%A4%9A%E7%A7%8D%E5%AE%9E%E7%8E%B0/)              原生redis分布式锁实现,支持注解,不推荐项目中使用,仅供学习使用
7+
8+
redis-distributed-lock-demo-spring   redis-distributed-lock-core 调用实例,仅供学习
9+
10+
[redis-distributed-lock-starter](./redis-distributed-lock-starter/readme.md)             基于Redisson的分布式锁spring starter实现,可用于实际项目中
11+
12+
[redis-distributed-lock-starter-demo](./redis-distributed-lock-starter-demo/readme.md)   redis-distributed-lock-starter调用实例
13+
14+
## 文档
15+
### springboot应用(直接编程方式)
16+
1. 针对springboot应用只需要引入依赖
17+
18+
<!--分布式锁redisson版本-->
19+
<dependency>
20+
<groupId>com.snowalker</groupId>
21+
<artifactId>redis-distributed-lock-starter</artifactId>
22+
<version>1.0.0</version>
23+
</dependency>
24+
2. 直接编程方式调用如下,在需要加锁的定时任务中,注入 **RedissonLock** 实体,即可进行加锁、解锁等操作。
25+
<br/>锁自动释放时间默认为10秒,这个时间需要你根据自己的业务执行时间自行指定。
26+
@Autowired
27+
RedissonLock redissonLock;
28+
29+
@Scheduled(cron = "${redis.lock.cron}")
30+
public void execute() throws InterruptedException {
31+
if (redissonLock.lock("redisson", 10)) {
32+
LOGGER.info("[ExecutorRedisson]--执行定时任务开始,休眠三秒");
33+
Thread.sleep(3000);
34+
System.out.println("=======================业务逻辑=============================");
35+
LOGGER.info("[ExecutorRedisson]--执行定时任务结束,休眠三秒");
36+
redissonLock.release("redisson");
37+
} else {
38+
LOGGER.info("[ExecutorRedisson]获取锁失败");
39+
}
40+
}
41+
42+
3. 你可以改变测试demo的端口,起多个查看日志,能够看到同一时刻只有一个实例获取锁成功并执行业务逻辑
43+
44+
2018-07-10 23:00:12.810 |-INFO [main] org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer [198] -| Tomcat started on port(s): 8888 (http)
45+
2018-07-10 23:00:12.814 |-INFO [main] com.snowalker.RedisDistributedLockStarterDemoApplication [57] -| Started RedisDistributedLockStarterDemoApplication in 2.684 seconds (JVM running for 3.038)
46+
2018-07-10 23:00:15.033 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.RedissonLock [35] -| 获取Redisson分布式锁[成功],lockName=redisson
47+
2018-07-10 23:00:15.034 |-INFO [pool-3-thread-1] com.snowalker.executor.ExecutorRedissonNormal [27] -| [ExecutorRedisson]--执行定时任务开始,休眠三秒
48+
=======================业务逻辑=============================
49+
2018-07-10 23:00:18.035 |-INFO [pool-3-thread-1] com.snowalker.executor.ExecutorRedissonNormal [30] -| [ExecutorRedisson]--执行定时任务结束,休眠三秒
50+
2018-07-10 23:00:20.005 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.RedissonLock [35] -| 获取Redisson分布式锁[成功],lockName=redisson
51+
2018-07-10 23:00:20.006 |-INFO [pool-3-thread-1] com.snowalker.executor.ExecutorRedissonNormal [27] -| [ExecutorRedisson]--执行定时任务开始,休眠三秒
52+
=======================业务逻辑=============================
53+
### springboot应用(注解方式方式)
54+
1. 前提条件同样是要引入依赖
55+
56+
<!--分布式锁redisson版本-->
57+
<dependency>
58+
<groupId>com.snowalker</groupId>
59+
<artifactId>redis-distributed-lock-starter</artifactId>
60+
<version>1.0.0</version>
61+
</dependency>
62+
2. 注解方式调用如下,在需要加锁的定时任务的执行方法头部,添加 **@DistributedLock(value = "redis-lock", expireSeconds = 11)**
63+
即可进行加锁、解锁等操作。<br/>锁自动释放时间默认为10秒,这个时间需要你根据自己的业务执行时间自行指定。
64+
<br/>我这里以spring schedule定时任务为例,用其他的定时任务同理,只需要添加注解。
65+
66+
@Scheduled(cron = "${redis.lock.cron}")
67+
@DistributedLock(value = "redis-lock", expireSeconds = 11)
68+
public void execute() throws InterruptedException {
69+
LOGGER.info("[ExecutorRedisson]--执行定时任务开始,休眠三秒");
70+
Thread.sleep(3000);
71+
System.out.println("=======================业务逻辑=============================");
72+
LOGGER.info("[ExecutorRedisson]--执行定时任务结束,休眠三秒");
73+
}
74+
75+
3. 你可以改变测试demo的端口,起多个查看日志,能够看到同一时刻只有一个实例获取锁成功并执行业务逻辑
76+
77+
2018-07-11 09:48:06.330 |-INFO [main] com.snowalker.RedisDistributedLockStarterDemoApplication [57] -| Started RedisDistributedLockStarterDemoApplication in 3.901 seconds (JVM running for 4.356)
78+
2018-07-11 09:48:10.006 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.annotation.DistributedLockHandler [32] -| [开始]执行RedisLock环绕通知,获取Redis分布式锁开始
79+
2018-07-11 09:48:10.622 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.RedissonLock [35] -| 获取Redisson分布式锁[成功],lockName=redis-lock
80+
2018-07-11 09:48:10.622 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.annotation.DistributedLockHandler [39] -| 获取Redis分布式锁[成功],加锁完成,开始执行业务逻辑...
81+
2018-07-11 09:48:10.625 |-INFO [pool-3-thread-1] com.snowalker.executor.ExecutorRedissonAnnotation [22] -| [ExecutorRedisson]--执行定时任务开始,休眠三秒
82+
=======================业务逻辑=============================
83+
2018-07-11 09:48:13.625 |-INFO [pool-3-thread-1] com.snowalker.executor.ExecutorRedissonAnnotation [25] -| [ExecutorRedisson]--执行定时任务结束,休眠三秒
84+
2018-07-11 09:48:13.627 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.annotation.DistributedLockHandler [46] -| 释放Redis分布式锁[成功],解锁完成,结束业务逻辑...
85+
2018-07-11 09:48:13.628 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.annotation.DistributedLockHandler [50] -| [结束]执行RedisLock环绕通知

pom.xml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>com.snowalker</groupId>
8+
<artifactId>redis-distributed-lock</artifactId>
9+
<version>1.0.0</version>
10+
<modules>
11+
<module>redis-distributed-lock-core</module>
12+
<module>redis-distributed-lock-demo-spring</module>
13+
<module>redis-distributed-lock-starter</module>
14+
<module>redis-distributed-lock-starter-demo</module>
15+
</modules>
16+
<packaging>pom</packaging>
17+
18+
<name>redis-distributed-lock</name>
19+
20+
21+
22+
</project>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#最大连接数
2+
redis.max.total=20
3+
#最大空闲连接数,在jedispool中最大的idle状态(空闲的)的jedis实例的个数
4+
redis.max.idle=20
5+
#最小空闲连接数,在jedispool中最小的idle状态(空闲的)的jedis实例的个数
6+
redis.min.idle=10
7+
#在取连接时测试连接的可用性,在borrow一个jedis实例的时候,是否要进行验证操作,如果赋值true。则得到的jedis实例肯定是可以用的
8+
redis.test.borrow=true
9+
#再还连接时不测试连接的可用性,<br/>在return一个jedis实例的时候,是否要进行验证操作,如果赋值true。则放回jedispool的jedis实例肯定是可以用的。
10+
redis.test.return=true
11+
#服务端ip
12+
redis.ip=172.30.66.80
13+
#服务端port
14+
redis.port=6379
15+
#redis连接超时时间
16+
redis.server.timeout=3000
17+
#锁超时时间
18+
redis.lock.timeout=5000
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
6+
<modelVersion>4.0.0</modelVersion>
7+
8+
<groupId>com.snowalker</groupId>
9+
<artifactId>redis-distributed-lock-core</artifactId>
10+
<version>1.0.0</version>
11+
12+
<name>redis-distributed-lock-core</name>
13+
<!-- FIXME change it to the project's website -->
14+
<url>http://www.example.com</url>
15+
16+
<properties>
17+
<aspectjweaver>1.8.10</aspectjweaver>
18+
<aspecjrt>1.8.10</aspecjrt>
19+
<apache-common-lang3>3.4</apache-common-lang3>
20+
<google-guava>20.0</google-guava>
21+
<jedis>2.9.0</jedis>
22+
<slf4j-api>1.7.25</slf4j-api>
23+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
24+
<maven.compiler.source>1.7</maven.compiler.source>
25+
<maven.compiler.target>1.7</maven.compiler.target>
26+
</properties>
27+
28+
<dependencies>
29+
<dependency>
30+
<groupId>junit</groupId>
31+
<artifactId>junit</artifactId>
32+
<version>4.11</version>
33+
<scope>test</scope>
34+
</dependency>
35+
36+
<!-- aspectjrt -->
37+
<dependency>
38+
<groupId>org.aspectj</groupId>
39+
<artifactId>aspectjrt</artifactId>
40+
<version>${aspecjrt}</version>
41+
</dependency>
42+
<!-- aspectjweaver -->
43+
<dependency>
44+
<groupId>org.aspectj</groupId>
45+
<artifactId>aspectjweaver</artifactId>
46+
<version>${aspectjweaver}</version>
47+
</dependency>
48+
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
49+
<dependency>
50+
<groupId>org.apache.commons</groupId>
51+
<artifactId>commons-lang3</artifactId>
52+
<version>${apache-common-lang3}</version>
53+
</dependency>
54+
<dependency>
55+
<groupId>com.google.guava</groupId>
56+
<artifactId>guava</artifactId>
57+
<version>${google-guava}</version>
58+
</dependency>
59+
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
60+
<dependency>
61+
<groupId>redis.clients</groupId>
62+
<artifactId>jedis</artifactId>
63+
<version>${jedis}</version>
64+
</dependency>
65+
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
66+
<dependency>
67+
<groupId>org.slf4j</groupId>
68+
<artifactId>slf4j-api</artifactId>
69+
<version>${slf4j-api}</version>
70+
</dependency>
71+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
72+
<dependency>
73+
<groupId>org.springframework</groupId>
74+
<artifactId>spring-context</artifactId>
75+
<version>4.3.18.RELEASE</version>
76+
<scope>provided</scope>
77+
</dependency>
78+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
79+
<dependency>
80+
<groupId>org.springframework</groupId>
81+
<artifactId>spring-core</artifactId>
82+
<version>4.3.18.RELEASE</version>
83+
<scope>provided</scope>
84+
</dependency>
85+
<!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
86+
<dependency>
87+
<groupId>org.redisson</groupId>
88+
<artifactId>redisson</artifactId>
89+
<version>3.5.4</version>
90+
</dependency>
91+
92+
</dependencies>
93+
94+
<build>
95+
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
96+
<plugins>
97+
<plugin>
98+
<artifactId>maven-clean-plugin</artifactId>
99+
<version>3.0.0</version>
100+
</plugin>
101+
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
102+
<plugin>
103+
<artifactId>maven-resources-plugin</artifactId>
104+
<version>3.0.2</version>
105+
</plugin>
106+
<plugin>
107+
<artifactId>maven-compiler-plugin</artifactId>
108+
<version>3.7.0</version>
109+
</plugin>
110+
<plugin>
111+
<artifactId>maven-surefire-plugin</artifactId>
112+
<version>2.20.1</version>
113+
</plugin>
114+
<plugin>
115+
<artifactId>maven-jar-plugin</artifactId>
116+
<version>3.0.2</version>
117+
</plugin>
118+
<plugin>
119+
<artifactId>maven-install-plugin</artifactId>
120+
<version>2.5.2</version>
121+
</plugin>
122+
<plugin>
123+
<artifactId>maven-deploy-plugin</artifactId>
124+
<version>2.8.2</version>
125+
</plugin>
126+
</plugins>
127+
</pluginManagement>
128+
</build>
129+
</project>
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# redis分布式锁
2+
## 1. 使用配置
3+
4+
>配置文件为redis.properties,需要放在类路径下,编码格式UTF-8
5+
6+
### 1.2 配置项目
7+
<table>
8+
<tr>
9+
<td>参数名称</td>
10+
<td>参数解释</td>
11+
</tr>
12+
<tr>
13+
<td>redis.max.total</td>
14+
<td>最大连接数</td>
15+
</tr>
16+
<tr>
17+
<td>redis.max.idle</td>
18+
<td>最大空闲连接数,在jedispool中最大的idle状态(空闲的)的jedis实例的个数</td>
19+
</tr>
20+
<tr>
21+
<td>redis.min.idle</td>
22+
<td>最小空闲连接数,在jedispool中最小的idle状态(空闲的)的jedis实例的个数</td>
23+
</tr>
24+
<tr>
25+
<td>redis.test.borrow</td>
26+
<td>在取连接时测试连接的可用性,在borrow一个jedis实例的时候,<br/>是否要进行验证操作,如果赋值true。则得到的jedis实例肯定是可以用的</td>
27+
</tr>
28+
<tr>
29+
<td>redis.test.return</td>
30+
<td>再还连接时不测试连接的可用性,<br/>在return一个jedis实例的时候,是否要进行验证操作,如果赋值true。则放回jedispool的jedis实例肯定是可以用的。</td>
31+
</tr>
32+
<tr>
33+
<td>redis.ip</td>
34+
<td>redis服务端ip</td>
35+
</tr>
36+
<tr>
37+
<td>redis.port</td>
38+
<td>redis服务端port</td>
39+
</tr>
40+
<tr>
41+
<td>redis.server.timeout</td>
42+
<td>redis连接超时时间</td>
43+
</tr>
44+
<tr>
45+
<td>redis.lock.timeout</td>
46+
<td>锁超时时间</td>
47+
</tr>
48+
</table>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.snowalker.annotation;
2+
3+
import java.lang.annotation.*;
4+
5+
/**
6+
* @author wuwl@19pay.com.cn
7+
* @date 2018-7-9
8+
* @desc
9+
*/
10+
@Documented
11+
@Inherited
12+
@Retention(RetentionPolicy.RUNTIME)
13+
@Target({ElementType.TYPE, ElementType.METHOD})
14+
public @interface RedisLock {
15+
16+
String value() default "redis-lock";
17+
}

0 commit comments

Comments
 (0)