pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.12.RELEASE</version>
<relativePath />
</parent>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.16.8</version>
</dependency>
redisson 配置
package com.my.test.config;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Redission配置类
*/
@Slf4j
@Configuration
public class RedissionConfig {
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379") // Redis服务器地址和端口
.setPassword("123456"); // 如果有密码,请设置密码
return Redisson.create(config);
}
}
aop配置
注解 Str1Lock
package com.my.test.aop;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 一个字符串作为KEY 的分布式锁
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Str1Lock {
}
切面 Str1LockAspect
package com.my.test.aop;
import com.my.test.ro.R;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component
@Slf4j
@Order(2)
public class Str1LockAspect {
@Autowired
private RedissonClient redissonClient;
/**
* 切面在控制层里加注解
*/
@Pointcut("execution(public * com.my.test.controller.*.*(..)) &&@annotation(Str1Lock) ")
public void pointCut(){
}
@Around("pointCut()")
@SneakyThrows
public Object handleAround(ProceedingJoinPoint proceedingJoinPoint) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String key=request.getHeader("key");
log.info("开始加锁...");
RLock lock = redissonClient.getLock(key);
if (lock.tryLock()) {
log.info("加锁成功...");
try {
Object result = proceedingJoinPoint.proceed();
return result;
}finally {
lock.unlock();
}
}else {
log.error("加锁失败...");
return R.error("稍后再试..");
}
}
}
控制层使用
@Autowired
private RedissonClient redissonClient;
@GetMapping("/ttt")
@ApiOperation("redis测试")
@Str1Lock
public com.my.test.ro.R ttt() throws Exception{
System.out.println("进入业务代码啦。。。。");
Thread.sleep(30000);
return com.my.test.ro.R.success();
}
JMeter并发测试
0表示并发