>  기사  >  데이터 베이스  >  SpringBoot의 사용자 정의 캐시 주석을 통해 Redis에 데이터베이스 데이터를 캐시하는 방법

SpringBoot의 사용자 정의 캐시 주석을 통해 Redis에 데이터베이스 데이터를 캐시하는 방법

WBOY
WBOY앞으로
2023-06-01 13:49:061270검색

Implementation

먼저 Mysql

SpringBoot의 사용자 정의 캐시 주석을 통해 Redis에 데이터베이스 데이터를 캐시하는 방법

에서 새로운 테이블을 생성합니다.

SpringBoot의 사용자 정의 캐시 주석을 통해 Redis에 데이터베이스 데이터를 캐시하는 방법

그런 다음 백그라운드 프레임워크에 Redis 운영을 위한 관련 종속성과 도구 클래스가 추가되었습니다.

하지만 여기에서 측면 종속성도 추가해야 합니다.

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --><dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.14.RELEASE</version>
        </dependency>

그런 다음 Redis 캐시를 추가하기 위한 주석을 생성하고

package com.ruoyi.system.redisAop;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*
 * @Author
 * @Description 新增redis缓存
 **/@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)public @interface AopCacheEnable {//redis缓存key    String[] key();//redis缓存存活时间默认值(可自定义)long expireTime() default 3600;

}

구성 클래스가 저장된 Redis 캐시 주석

package com.ruoyi.system.redisAop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*
 * @Description 删除redis缓存注解
 **/@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)public @interface AopCacheEvict {//redis中的key值    String[] key();
}

을 삭제합니다.

package com.ruoyi.system.redisAop;


import com.ruoyi.system.domain.BusStudent;
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.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;/*
 * @Description 自定义缓存切面具体实现类
 **/@Aspect
@Componentpublic class CacheEnableAspect {

    @Autowiredpublic RedisTemplate redisCache;/**
     * Mapper层切点 使用到了我们定义的 AopCacheEnable 作为切点表达式。     */@Pointcut("@annotation(com.ruoyi.system.redisAop.AopCacheEnable)")public void queryCache() {
    }/**
     * Mapper层切点 使用到了我们定义的 AopCacheEvict 作为切点表达式。     */@Pointcut("@annotation(com.ruoyi.system.redisAop.AopCacheEvict)")public void ClearCache() {
    }

    @Around("queryCache()")public Object Interceptor(ProceedingJoinPoint pjp) {
        Object result = null;//注解中是否有#标识boolean spelFlg = false;//判断是否需要走数据库查询boolean selectDb = false;//redis中缓存的keyString redisKey = "";//获取当前被切注解的方法名Method method = getMethod(pjp);//获取当前被切方法的注解AopCacheEnable aopCacheEnable = method.getAnnotation(AopCacheEnable.class);//获取方法参数值Object[] arguments = pjp.getArgs();//从注解中获取字符串String[] spels = aopCacheEnable.key();for (String spe1l : spels) {if (spe1l.contains("#")) {//注解中包含#标识,则需要拼接spel字符串,返回redis的存储redisKeyredisKey = spe1l.substring(1) + arguments[0].toString();
            } else {//没有参数或者参数是List的方法,在缓存中的keyredisKey = spe1l;
            }//取出缓存中的数据result = redisCache.opsForValue().get(redisKey);//缓存是空的,则需要重新查询数据库if (result == null || selectDb) {try {
                    result =  pjp.proceed();//从数据库查询到的结果不是空的if (result != null && result instanceof ArrayList) {//将redis中缓存的结果转换成对象listList<BusStudent> students = (List<BusStudent>) result;//判断方法里面的参数是不是BusStudentif (arguments[0] instanceof BusStudent) {//将rediskey-students 存入到redisredisCache.opsForValue().set(redisKey, students, aopCacheEnable.expireTime(), TimeUnit.SECONDS);
                        }
                    }
                } catch (Throwable e) {
                    e.printStackTrace();
                }
            }
        }return result;
    }/*** 定义清除缓存逻辑,先操作数据库,后清除缓存*/@Around(value = "ClearCache()")public Object evict(ProceedingJoinPoint pjp) throws Throwable {//redis中缓存的keyMethod method = getMethod(pjp);// 获取方法的注解AopCacheEvict cacheEvict = method.getAnnotation(AopCacheEvict.class);//先操作dbObject result = pjp.proceed();// 获取注解的key值String[] fieldKeys = cacheEvict.key();for (String spe1l : fieldKeys) {//根据key从缓存中删除            redisCache.delete(spe1l);
        }return result;
    }/**
     * 获取被拦截方法对象     */public Method getMethod(ProceedingJoinPoint pjp) {
        Signature signature = pjp.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method targetMethod = methodSignature.getMethod();return targetMethod;
    }
}

그런 다음 새로운 사용자 정의 캐시 측면 구현 클래스를 생성합니다. CacheEnableAspect

저장 위치SpringBoot의 사용자 정의 캐시 주석을 통해 Redis에 데이터베이스 데이터를 캐시하는 방법

    @AopCacheEnable(key = "BusStudent",expireTime = 40)public List<BusStudent> selectBusStudentList(BusStudent busStudent);

여기서 queryCache와 ClearCache에 주의하세요. 내부의 포인트컷 표현식

은 각각 두 개의 맞춤형 AopCacheEnable과 AopCacheEvict에 해당합니다.

그런 다음 알림을 둘러싼 queryCache 메서드가 실행되기 전과 후에

cut 메서드의 매개 변수와 매개 변수의 키를 얻은 다음 해당 키에 따라 redis를 쿼리합니다.

찾을 수 없으면 다음을 변환합니다.

찾을 수 있으면 결과가 반환됩니다.

그런 다음 이 테이블의 쿼리 메서드와 매퍼 레이어를 찾습니다. 예를 들어 쿼리 반환 결과를 redis

    /**
     * 新增学生
     *
     * @param busStudent 学生
     * @return 结果     */@AopCacheEvict(key = "BusStudent")public int insertBusStudent(BusStudent busStudent);/**
     * 修改学生
     *
     * @param busStudent 学生
     * @return 结果     */@AopCacheEvict(key = "BusStudent")public int updateBusStudent(BusStudent busStudent);/**
     * 删除学生
     *
     * @param id 学生ID
     * @return 结果     */@AopCacheEvict(key = "BusStudent")public int deleteBusStudentById(Integer id);

에 저장하려는 경우 이 테이블을 추가, 편집, 삭제하는 매퍼 메서드에

rrreee

를 추가합니다. 여기서 주석에 주의하세요. 키는 위 쿼리의 주석 키와 일치해야 합니다.

그런 다음 시작 시 프롬프트가 표시되면 프로젝트를 시작하십시오.

빈 중 하나를 @Primary로 표시하고

소비자가 액세스하도록 업데이트하는 것을 고려하세요SpringBoot의 사용자 정의 캐시 주석을 통해 Redis에 데이터베이스 데이터를 캐시하는 방법

sringboot가 @를 통해 인터페이스의 여러 구현 클래스가 있음을 발견했기 때문입니다. Autowired, 즉 이 인터페이스를 상속하는 여러 클래스가 있고 스프링 컨테이너는 어떤 클래스를 사용할지 모릅니다.

redis 구성 클래스를 찾아 RedisTemplate에 @Primary 주석을 추가합니다SpringBoot의 사용자 정의 캐시 주석을 통해 Redis에 데이터베이스 데이터를 캐시하는 방법

주석 사용 확인

디버그로 프로젝트를 시작하고 CacheEnableAspect에서 주석의 중단점을 쿼리한 다음 쿼리 메서드를 호출합니다. ,

중단점을 입력할 수 있게 되면 원하는 논리와 효과에 따라 주석을 수정할 수 있습니다. SpringBoot의 사용자 정의 캐시 주석을 통해 Redis에 데이터베이스 데이터를 캐시하는 방법

SpringBoot의 사용자 정의 캐시 주석을 통해 Redis에 데이터베이스 데이터를 캐시하는 방법

🎜🎜

위 내용은 SpringBoot의 사용자 정의 캐시 주석을 통해 Redis에 데이터베이스 데이터를 캐시하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제