Springboot自定义注解+aop实现redis自动清除缓存功能

发布于:2024-04-29 ⋅ 阅读:(24) ⋅ 点赞:(0)

假如我们是一个商家,我们在管理端 设置好菜品之后,每次不同的用户访问我们的菜品,都要查询数据库,当访问者多的时候,会造成数据库的卡顿,所以使用redis进行缓存,这样只需要读取一次数据库,就可以的大大减少数据库的访问压力,但是当我们 管理端对某个菜品进行删除的时候,用户再次访问,还会访问到我们redis 数据库的数据,这时候就会出现bug,所以我们在删除菜品的时候,也应该把对应的redis的菜品缓存数据删除

 但是我们执行删除修改增加菜品的时候,统一设置删除缓存数据,但是我们一个个的调用封装的删除缓存的方法太麻烦了,我们不妨直接使用aop+注解的形式统一进行缓存删除的管理

1. 自定义注解.

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Deleterediscache {
}

2.使用aop对删除增加修改菜品的方法进行 统一删除缓存

@Aspect
@Slf4j
@Component
public class DeleteRedisCache {
    @Autowired
    RedisTemplate redisTemplate;
    @Pointcut("execution(* com.sky.mapper.*.*(..))&& @annotation(com.sky.annotation.Deleterediscache)")
public void pointcut(){}
    @After("pointcut()")
    public void deleteRedisCache(JoinPoint joinPoint){
        log.info("开始清理redis缓存");
        //获取方法签名
        MethodSignature signature = ( MethodSignature)joinPoint.getSignature();
        //获取方法签名的注解名称
        Deleterediscache deleterediscache = signature.getMethod().getAnnotation(Deleterediscache.class);
        if(deleterediscache !=null){
            Set keys = redisTemplate.keys("dish_*");
            redisTemplate.delete(keys);
        }
        log.info("redis缓存清理完毕");
    }

}