下载帮

您现在的位置是:首页 > 数据库 > Redis

Redis

自定义注解优先访问Redis缓存

2022-06-22 22:20Redis

背景

一般访问数据库的时候,我们都会优先访问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);

}

文章评论