自定义注解优先访问Redis缓存
背景
一般访问数据库的时候,我们都会优先访问Redis中是否存在该数据,如果有就直接返回,如果没有才访问mysql,并且把数据保存到Redis中。但是每写一个dao接口就要写一次访问Redis逻辑比较麻烦,因此自定义一个注解,只要加上这个注解就自动的检查Redis是否有该数据,同时没有也能自动缓存起来。
实现
1.定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RedisCheck {
String key() default "";//key值
int delTime() default 180;//key删除时间
}
2.使用代理,监听注解
@Aspect
@Component
public class RedisCheckAop {
@Autowired
private RedisCacheUtil redisCacheUtil;
@Around("@annotation(com.dmsl.annotation.RedisCheck)")
public Object RedisCheck(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取注解
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
RedisCheck annotation = method.getAnnotation(RedisCheck.class);
String key = annotation.key();
int delTime = annotation.delTime();
Object[] args = joinPoint.getArgs();
Object data = redisCacheUtil.GetCacheData(key,args);
if(data!=null)
return data;
Object result = joinPoint.proceed(args);//调用原本的Service函数,访问mysql获取数据
redisCacheUtil.AddCacheData(key,args,result,delTime);
return result;
}
}
3.Redis缓存管理工具
@Component
public class RedisCacheUtil {
@Resource
private RedisUtil redisUtil;
public Object GetCacheData(String key, Object[] args )
{
key = GetKey(key,args);
Object data =null;
if (redisUtil.hasKey(key)) {
data = redisUtil.get(key);
}
return data;
}
public void AddCacheData(String key, Object[] args,Object data,int delTime)
{
key = GetKey(key,args);
redisUtil.set(key, data);
if(delTime>0)
redisUtil.expire(key, delTime);
}
public void RemoveCacheData(String key, Object[] args){
key = GetKey(key,args);
if (redisUtil.hasKey(key)) {
redisUtil.del(key);
}
}
public void RemoveCacheData(String key, Object arg){
key = GetKey(key,arg);
if (redisUtil.hasKey(key)) {
redisUtil.del(key);
}
}
}
4.使用方法
@RedisCheck(key = RedisKey.topViewVideoKey)
public List<VideoEntity> FindTopViewCountVideo(int start, int len) {
return videoMapper.FindTopViewCountVideo(start, len);
}