SpringAop切面编程简单应用整合Redis

本文通过Spring AOP和Redis展示了如何在请求时从缓存中获取数据并后台更新缓存。适用于实时性要求不高但需要优化查询性能的场景。通过定义注解和切面,实现了数据的异步更新,确保在数据更新不频繁且对查询结果影响较小的情况下,提供近似的最新数据。文章还包含了代码示例和测试步骤。
摘要由CSDN通过智能技术生成

系统上需要一个需求,在请求的时候直接从redis中获取值返回,并在后台同时更新redis缓存,这种对于系统实时性要求不高的,可以用切面的方法实现。

定义一个注解

在这里插入图片描述

定义一个切面

在这里插入图片描述
详细代码:

package com.wudiqiang.aspect;

import com.wudiqiang.utils.RedisUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @Author: 着凉的皮皮虾
 * @Date: 2019/11/29 21:59
 * @Description:
 */
@Component
@Aspect
public class CacheAspect {

    @Autowired
    private RedisUtil redisUtil;

    //: 监听此注解
    @Pointcut("@annotation(com.wudiqiang.annotation.AspectTest)")
    public void AspectTest() {

    }

    @Around(value = "AspectTest()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("进入切面");
        Object[] args = joinPoint.getArgs();
        //: 查看参数
        String key = args[0].toString();

        System.out.println(args[0].toString());
        Signature signature = joinPoint.getSignature();
        MethodSignature sig = (MethodSignature) signature;
        Object target = joinPoint.getTarget();
        Method method = target.getClass().getMethod(sig.getName(), sig.getParameterTypes());

        //: 某方法上是否有某注解
        //boolean annotationPresent = method.isAnnotationPresent(AspectTest.class);
        if (redisUtil.hasKey(key)) {
            //: 如果redis存在此值,直接从redis获取
            Object o = redisUtil.get(key);
            return o;
        }else {
            Object proceed = joinPoint.proceed();
            redisUtil.set(key, proceed, 100000L);
            return proceed;
        }
    }
}

启动应用

在这里插入图片描述
首先我们的redis服务器数据库1现在是什么数据都没有的
在这里插入图片描述
并且定义监控的方法返回值如此:
在这里插入图片描述
发送请求,获取返回的结果。

修改返回值

此时redis中存在了这条记录

在这里插入图片描述
修改返回结果
在这里插入图片描述
再次请求仍然是结果修改前的数据,证明没有走方法,直接走的缓存。

改动代码,返回缓存中结果后更新缓存

在这里插入图片描述

测试

如果情况符合预期的话,连续两次请求第一次返回“这是一个测试的语句”,第二次返回“改变后的语句”!

重启应用

在这里插入图片描述
第一次结果

在这里插入图片描述
此时redis中缓存的数据已经变了

第二次请求

在这里插入图片描述

基于AOP,就实现了缓存数据的异步更新问题,这种功能主要针对于一些查询比较慢的接口的优化,(数据实时返回,后台执行慢查询的接口进行更新)同时最重要的一个点就是数据更新不频繁,或者更新后对查询结果影响不是特别巨大,并没有实时性的这种特点的数据,可以采取这种方法,毕竟,每次请求获取到的数据并不是最新的数据。当然,这段代码能优化的地方很多,是我闲暇总结的时候在家随便写的一点,如果有针对这种需求的更好的方法,或者说本文中出现的错误,烦请不吝赐教。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值