概述
有这样一个需求,在调用方法前,先去Redis中查询结果,如果Redis中有数据,直接返回,没有数据的时候从数据库中查询
demo
思路是,通过SpringAOP,在调用方法前,先查询缓存,如果存在缓存,则返回缓存数据,阻止方法调用,入股没有缓存,则调用业务方法,然后将结果放到缓存中
AOP类
@Aspect
@Component
public class RedisCacheAspect {
@Autowired
private RedisTemplate redisTemplate;
@Around("execution(public * learn.dlmsProxy.cashthird..*.*(..))")
public Object cache(ProceedingJoinPoint joinPoint)throws Throwable{
//取得类名、方法名和参数
String clazzName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
String key = clazzName+":"+methodName;
String o = (String) redisTemplate.opsForValue().get(key);
Object result = null;
if (o==null){
//没有查到数据
result = joinPoint.proceed(joinPoint.getArgs());
/*
序列化,将对象的状态信息转换为可用存储或传输的过程
对象将其当前状态写入到临时或持久性存储区
*/
String serialize = JSON.toJSONString(result);
//设置一个过期时间,时间到了以后仍然可以与数据库同步,防止读出脏数据
redisTemplate.opsForValue().set(key,serialize,10, TimeUnit.SECONDS);
}else {
/*
反序列化是指,通过从存储区中读取对象数据,并重建该对象
*/
result = JSON.parse(o);
}
return result;
}
}
数据库类:
@RestController
@RequestMapping("/weibogetdata")
public class WeiboGetData {
@Autowired
private IWeiboUserInfoService iWeiboUserInfoService;
@PostMapping("login")
public Result login(@RequestBody WeiboUserInfo userInfo) {
QueryWrapper<WeiboUserInfo> queryWrapper = new QueryWrapper();
queryWrapper.lambda().eq(WeiboUserInfo::getUserLoginName,userInfo.getUserLoginName());
WeiboUserInfo one = iWeiboUserInfoService.getOne(queryWrapper);
return new Result("200","good",one);
}
}
结果: