pom文件配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
application.yml配置:
server:
port: 8081
spring:
redis:
jedis:
pool:
# 最大空閑連接數(shù)
max-idle: 500
# 最小空閑連接數(shù)
min-idle: 50
# 等待可用連接的最大時間讯蒲,負(fù)數(shù)為不限制
max-wait: -1s
# 最大活躍連接數(shù),負(fù)數(shù)為不限制
max-active: -1
host: 192.168.67.129
port: 6378
timeout: 30s
RedisLockConfiguration配置類:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.integration.redis.util.RedisLockRegistry;
@Configuration
public class RedisLockConfiguration {
@Bean
public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
return new RedisLockRegistry(redisConnectionFactory, "redis-lock", 5000L);
}
}
controller:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.redis.util.RedisLockRegistry;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.locks.Lock;
@RestController
@RequestMapping("/redis")
public class RedisLockController {
Logger logger = LoggerFactory.getLogger(RedisLockController.class);
private int item = 50;//模擬只有50個庫存量
private static final String KEY = "item";
@Autowired
private RedisLockRegistry redisLockRegistry;
@RequestMapping("/sale")
public String sale() {
while (item > 0) {
Lock lock = redisLockRegistry.obtain(KEY);
lock(lock);
try {
if (item > 0){
logger.info(Thread.currentThread().getName()+"搶到資源");
item--;
return Thread.currentThread().getName()+"搶到資源,剩余:"+item+"個";
}
}finally {
lock.unlock();
}
}
logger.info(Thread.currentThread().getName()+"搶不到資源");
return Thread.currentThread().getName()+"搶不到資源";
}
@RequestMapping("/test")
public String test(){
return "測試";
}
public void lock(Lock lock){
//1.嘗試加鎖
try {
if(lock.tryLock()){
return ;
}
} catch (Exception e) {
e.printStackTrace();
}
//2.加鎖失敗,當(dāng)前任務(wù)休眠一段時間
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//3.遞歸調(diào)用,再次去搶鎖
lock(lock);
}
}
使用jmeter發(fā)送請求:
image.png
image.png
image.png
調(diào)用日志:
2020-04-09 12:16:27.948 INFO 13832 --- [io-8081-exec-25] c.sune.controller.RedisLockController : http-nio-8081-exec-25搶到資源
2020-04-09 12:16:28.236 INFO 13832 --- [nio-8081-exec-5] c.sune.controller.RedisLockController : http-nio-8081-exec-5搶到資源
2020-04-09 12:16:28.509 INFO 13832 --- [io-8081-exec-19] c.sune.controller.RedisLockController : http-nio-8081-exec-19搶到資源
2020-04-09 12:16:28.802 INFO 13832 --- [io-8081-exec-11] c.sune.controller.RedisLockController : http-nio-8081-exec-11搶到資源
2020-04-09 12:16:29.127 INFO 13832 --- [nio-8081-exec-6] c.sune.controller.RedisLockController : http-nio-8081-exec-6搶到資源
2020-04-09 12:16:29.452 INFO 13832 --- [io-8081-exec-48] c.sune.controller.RedisLockController : http-nio-8081-exec-48搶到資源
2020-04-09 12:16:29.754 INFO 13832 --- [io-8081-exec-14] c.sune.controller.RedisLockController : http-nio-8081-exec-14搶到資源
2020-04-09 12:16:29.983 INFO 13832 --- [io-8081-exec-20] c.sune.controller.RedisLockController : http-nio-8081-exec-20搶到資源
2020-04-09 12:16:30.234 INFO 13832 --- [io-8081-exec-21] c.sune.controller.RedisLockController : http-nio-8081-exec-21搶到資源
2020-04-09 12:16:30.453 INFO 13832 --- [nio-8081-exec-3] c.sune.controller.RedisLockController : http-nio-8081-exec-3搶到資源
2020-04-09 12:16:30.646 INFO 13832 --- [nio-8081-exec-7] c.sune.controller.RedisLockController : http-nio-8081-exec-7搶到資源
2020-04-09 12:16:30.911 INFO 13832 --- [io-8081-exec-54] c.sune.controller.RedisLockController : http-nio-8081-exec-54搶到資源
2020-04-09 12:16:31.126 INFO 13832 --- [io-8081-exec-41] c.sune.controller.RedisLockController : http-nio-8081-exec-41搶到資源
2020-04-09 12:16:31.390 INFO 13832 --- [io-8081-exec-13] c.sune.controller.RedisLockController : http-nio-8081-exec-13搶到資源
2020-04-09 12:16:31.561 INFO 13832 --- [io-8081-exec-46] c.sune.controller.RedisLockController : http-nio-8081-exec-46搶到資源
2020-04-09 12:16:31.773 INFO 13832 --- [io-8081-exec-44] c.sune.controller.RedisLockController : http-nio-8081-exec-44搶到資源
2020-04-09 12:16:31.957 INFO 13832 --- [io-8081-exec-43] c.sune.controller.RedisLockController : http-nio-8081-exec-43搶到資源
2020-04-09 12:16:32.246 INFO 13832 --- [io-8081-exec-36] c.sune.controller.RedisLockController : http-nio-8081-exec-36搶到資源
2020-04-09 12:16:32.424 INFO 13832 --- [io-8081-exec-15] c.sune.controller.RedisLockController : http-nio-8081-exec-15搶到資源
2020-04-09 12:16:32.626 INFO 13832 --- [io-8081-exec-51] c.sune.controller.RedisLockController : http-nio-8081-exec-51搶到資源
2020-04-09 12:16:32.833 INFO 13832 --- [io-8081-exec-37] c.sune.controller.RedisLockController : http-nio-8081-exec-37搶到資源
2020-04-09 12:16:33.000 INFO 13832 --- [io-8081-exec-32] c.sune.controller.RedisLockController : http-nio-8081-exec-32搶到資源
2020-04-09 12:16:33.189 INFO 13832 --- [io-8081-exec-35] c.sune.controller.RedisLockController : http-nio-8081-exec-35搶到資源
2020-04-09 12:16:33.354 INFO 13832 --- [io-8081-exec-33] c.sune.controller.RedisLockController : http-nio-8081-exec-33搶到資源
2020-04-09 12:16:33.519 INFO 13832 --- [io-8081-exec-53] c.sune.controller.RedisLockController : http-nio-8081-exec-53搶到資源
2020-04-09 12:16:33.680 INFO 13832 --- [io-8081-exec-34] c.sune.controller.RedisLockController : http-nio-8081-exec-34搶到資源
2020-04-09 12:16:33.847 INFO 13832 --- [io-8081-exec-26] c.sune.controller.RedisLockController : http-nio-8081-exec-26搶到資源
2020-04-09 12:16:34.032 INFO 13832 --- [io-8081-exec-24] c.sune.controller.RedisLockController : http-nio-8081-exec-24搶到資源
2020-04-09 12:16:34.216 INFO 13832 --- [io-8081-exec-30] c.sune.controller.RedisLockController : http-nio-8081-exec-30搶到資源
2020-04-09 12:16:34.408 INFO 13832 --- [nio-8081-exec-8] c.sune.controller.RedisLockController : http-nio-8081-exec-8搶到資源
2020-04-09 12:16:34.577 INFO 13832 --- [nio-8081-exec-2] c.sune.controller.RedisLockController : http-nio-8081-exec-2搶到資源
2020-04-09 12:16:34.736 INFO 13832 --- [io-8081-exec-40] c.sune.controller.RedisLockController : http-nio-8081-exec-40搶到資源
2020-04-09 12:16:34.906 INFO 13832 --- [io-8081-exec-42] c.sune.controller.RedisLockController : http-nio-8081-exec-42搶到資源
2020-04-09 12:16:35.094 INFO 13832 --- [io-8081-exec-28] c.sune.controller.RedisLockController : http-nio-8081-exec-28搶到資源
2020-04-09 12:16:35.260 INFO 13832 --- [io-8081-exec-52] c.sune.controller.RedisLockController : http-nio-8081-exec-52搶到資源
2020-04-09 12:16:35.441 INFO 13832 --- [io-8081-exec-12] c.sune.controller.RedisLockController : http-nio-8081-exec-12搶到資源
2020-04-09 12:16:35.609 INFO 13832 --- [io-8081-exec-22] c.sune.controller.RedisLockController : http-nio-8081-exec-22搶到資源
2020-04-09 12:16:35.778 INFO 13832 --- [io-8081-exec-17] c.sune.controller.RedisLockController : http-nio-8081-exec-17搶到資源
2020-04-09 12:16:35.949 INFO 13832 --- [io-8081-exec-45] c.sune.controller.RedisLockController : http-nio-8081-exec-45搶到資源
2020-04-09 12:16:36.119 INFO 13832 --- [io-8081-exec-49] c.sune.controller.RedisLockController : http-nio-8081-exec-49搶到資源
2020-04-09 12:16:36.284 INFO 13832 --- [io-8081-exec-29] c.sune.controller.RedisLockController : http-nio-8081-exec-29搶到資源
2020-04-09 12:16:36.460 INFO 13832 --- [io-8081-exec-38] c.sune.controller.RedisLockController : http-nio-8081-exec-38搶到資源
2020-04-09 12:16:36.621 INFO 13832 --- [nio-8081-exec-4] c.sune.controller.RedisLockController : http-nio-8081-exec-4搶到資源
2020-04-09 12:16:36.788 INFO 13832 --- [nio-8081-exec-9] c.sune.controller.RedisLockController : http-nio-8081-exec-9搶到資源
2020-04-09 12:16:36.965 INFO 13832 --- [nio-8081-exec-1] c.sune.controller.RedisLockController : http-nio-8081-exec-1搶到資源
2020-04-09 12:16:37.141 INFO 13832 --- [io-8081-exec-16] c.sune.controller.RedisLockController : http-nio-8081-exec-16搶到資源
2020-04-09 12:16:37.316 INFO 13832 --- [io-8081-exec-27] c.sune.controller.RedisLockController : http-nio-8081-exec-27搶到資源
2020-04-09 12:16:37.485 INFO 13832 --- [io-8081-exec-39] c.sune.controller.RedisLockController : http-nio-8081-exec-39搶到資源
2020-04-09 12:16:37.662 INFO 13832 --- [io-8081-exec-50] c.sune.controller.RedisLockController : http-nio-8081-exec-50搶到資源
2020-04-09 12:16:37.829 INFO 13832 --- [io-8081-exec-31] c.sune.controller.RedisLockController : http-nio-8081-exec-31搶到資源
2020-04-09 12:16:38.121 INFO 13832 --- [io-8081-exec-55] c.sune.controller.RedisLockController : http-nio-8081-exec-55搶不到資源
2020-04-09 12:16:38.285 INFO 13832 --- [io-8081-exec-23] c.sune.controller.RedisLockController : http-nio-8081-exec-23搶不到資源
2020-04-09 12:16:38.454 INFO 13832 --- [io-8081-exec-18] c.sune.controller.RedisLockController : http-nio-8081-exec-18搶不到資源
2020-04-09 12:16:38.614 INFO 13832 --- [io-8081-exec-10] c.sune.controller.RedisLockController : http-nio-8081-exec-10搶不到資源
2020-04-09 12:16:38.853 INFO 13832 --- [io-8081-exec-47] c.sune.controller.RedisLockController : http-nio-8081-exec-47搶不到資源
有5個線程是搶不到資源,結(jié)果正確.