前言:
-
本文中自定义类的路径***需要改为个人指定具体内容
- 本文依赖redis版本较低。Spring Data Redis升到2.1.0后可直接使用setIfAbsent 还有 set(1,2,3,4) 方法更加方便
1、引入依赖
<!--主版本依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<!-- spring data redis1.8.1 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、自定义注解
package com.***;
import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;
/**
* @Description 注解定义 前缀、锁的过期时间、前缀和key的分隔符
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface CacheLock {
//redis锁前缀
String prefix() default "";
//redis锁过期时间
int expire() default 5;
//redis锁过期时间单位
TimeUnit timeUnit() default TimeUnit.SECONDS;
//redis key分隔符
String delimiter() default ":";
enum FieldNameEnum{
UPDATE_FORM("update_form"),
;
private final String name;
FieldNameEnum(String jsonPath) {
this.name = jsonPath;
}
public String getJsonPath() {
return name;
}
}
}
package com.***;
import java.lang.annotation.*;
/**
* @Description 注解到普通类型的入参或者实体类内部属性
*/
@Target({ElementType.METHOD,ElementType.PARAMETER,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface CacheParam {
String name() default "";
}
3、自定义 key锁 生成器
package com.***;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* @Description 定义公共接口
*/
public interface CacheKeyGenerator {
//获取AOP参数,生成指定缓存Key
String getLockKey(ProceedingJoinPoint joinPoint);
}