>  기사  >  데이터 베이스  >  SpringBoot가 Spring Cache를 통합하여 Redis 캐싱을 구현하는 방법

SpringBoot가 Spring Cache를 통합하여 Redis 캐싱을 구현하는 방법

PHPz
PHPz앞으로
2023-05-27 08:47:111213검색

    1. 소개

    Spring Cache는 Annotation 기반 캐싱 기능을 구현한 프레임워크입니다. 간단히 Annotation만 추가하면 캐싱 기능을 구현할 수 있습니다.

    Spring 캐시는 추상화 계층을 제공하며 맨 아래 계층은 다른 캐시 구현을 전환할 수 있습니다.

    구체적으로, 다양한 캐싱 기술이 CacheManager 인터페이스를 통해 통합됩니다.

    CacheManager는 Spring에서 제공하는 다양한 캐싱 기술에 대한 추상 인터페이스입니다. 이는 기본 캐싱 기술이며 Map에 캐시됩니다. 이는 서비스가 중단되면 캐시된 데이터가 사라짐을 의미합니다.

    다른 캐싱 기술에 대해 다른 CacheManager를 구현해야 함

    CacheManager Description
    EhCacheCacheManager EhCache를 캐싱 기술로 사용
    Gu avaCache Manager Google의 GuavaCache를 캐싱 기술로 사용
    RedisCacheManager Redis를 캐싱 기술로 사용

    2. 공통 주석

    Spring Boot 프로젝트에서 캐싱 기술을 사용하려면 해당 캐싱 기술의 종속성 패키지를 프로젝트로 가져오고 스타트업 수업에 활용해보세요@EnableCaching 캐싱 지원만 켜두시면 됩니다. 예를 들어 Redis를 캐싱 기술로 사용하려면 Spring 데이터 Redis의 Maven 좌표만 가져오면 됩니다. 일반적으로 사용되는 주석은 다음과 같습니다.

    느슨한 베팅 솔루션 기능 열기
    참고 @@ENableCaching
    @cacheable 데이터가 있으면 캐시된 데이터를 직접 반환합니다. 데이터가 없으면 메서드를 호출하고 메서드 반환 값을 캐시에 넣습니다
    @CachePut 메서드의 반환 값을 캐시에 넣습니다
    @CacheEvict 캐시에서 하나 이상의 데이터 조각을 삭제합니다.

    2.1, @EnableCaching

    이 주석의 주요 기능은 캐시 주석 기능을 활성화하고 다른 Spring Cache 주석을 적용하는 것입니다. 사용법도 매우 간단합니다. 프로젝트의 시작 클래스 바로 위에 추가하면 됩니다.

    @Slf4j
    @SpringBootApplication
    @EnableCaching
    public class CacheDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(CacheDemoApplication.class, args);
            log.info("项目启动成功...");
        }
    }

    2.2, @Cacheable

    @Cacheable 주석은 주로 메서드를 실행하기 전에 캐시에 데이터가 있는지 확인하는 데 사용됩니다. 데이터가 있으면 캐시된 데이터가 직접 반환되고, 데이터가 없으면 메서드가 호출되고 메서드 반환 값이 캐시에 저장됩니다. @Cacheable注解主要是在方法执行前 先查看缓存中是否有数据。如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中。

    注解中的参数传递主要使用的是**SpEL(Spring Expression Language)**对数据进行获取传递,这有点类似于JSP中的EL表达式,常用方式如下几种:

    • “#p0”:获取参数列表中的第一个参数。其中的“#p”为固定写法,0为下标,代表第一个;

    • “#root.args[0]”:获取方法中的第一个参数。其中0为下标,代表第一个。

    • “#user.id”:获取参数 user 的 id 属性。注意的是这里的 user 必须要和参数列表中的参数名一致

    • “#result.id”:获取返回值中的 id 属性。

    来自Spring Cache源码:Spring Expression Language (SpEL) expression used for making the method

    @Cacheable注解中有几种常用的属性可进行需求性设置:

    • value:缓存的名称,每个缓存名称下面可以有多个 key

    • key:缓存的key。

    • condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效

    • The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.

    /**
     * @description 通过id获取用户信息
     * @author xBaozi
     * @date 14:23 2022/7/3
     **/
    @Cacheable(value = "userCache", key = "#id", unless = "#result == null")
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) {
        User user = userService.getById(id);
        return user;
    }

    2.3、@CachePut

    @CachPut注解主要是将方法的返回值放到缓存中。这里同样是使用SpEL获取数据,常用的属性如下:

    • value:缓存的名称,每个缓存名称下面可以有多个 key

    • key:缓存的key。

    • condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效

    • The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.

    /**
     * @description 新增用户信息并返回保存的信息
     * @author xBaozi
     * @date 14:38 2022/7/3
     **/
    @CachePut(value = "userCache", key = "#user.id")
    @PostMapping
    public User save(User user) {
        userService.save(user);
        return user;
    }

    2.4、@CacheEvict

    @CacheeEvict主要是将一条或多条数据从缓存中删除,同样使用SpEL获取数据,常用的属性如下:

    • value:缓存的名称,每个缓存名称下面可以有多个 key

    • key:缓存的key。

    • condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效

    • The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.

    /**
     * @description 更新用户信息
     * @author xBaozi
     * @date 14:41 2022/7/3
     **/
    @CacheEvict(value = "userCache", key = "#result.id")
    @PutMapping
    public User update(User user) {
        userService.updateById(user);
        return user;
    }

    3、使用Redis当作缓存产品

    因为 Spring 默认的缓存技术无法持久化保存缓存数据,即服务挂了缓存也挂了,因此就需要使用Redis进行操作(其实也是因为学习了Redis)

    前面的SpringBoot整合Redis缓存验证码里面有记录着一些Redis的基本操作。

    3.1、坐标导入

    导入 maven 坐标:spring-boot-starter-data-redis、spring-boot-starter-cache

    <!--Spring Data Redis-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!--Spring Cache-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    3.2、yml配置

    spring:
      redis:
        host: localhost
        port: 6379
        password: 123456
        database: 0
        cache:
            redis:
                time-to-live: 1800000 # 设置缓存有效期

    3.3、开启注解功能

    在启动类 com/itheima/CacheDemoApplication.java

    주석의 매개변수 전송은 주로 **SpEL(Spring Expression Language)**을 사용하여 데이터를 얻고 전송합니다. 이는 JSP의 EL 표현식과 다소 유사합니다. 일반적으로 사용되는 방법은 다음과 같습니다.

    "#p0": 매개변수 목록의 첫 번째 매개변수를 가져옵니다. "#p"는 고정된 쓰기 방법이고 0은 첫 번째 것을 나타내는 아래 첨자입니다.

  • "#root.args[0]": 메서드의 첫 번째 매개변수를 가져옵니다. 그 중 0은 첫 번째 것을 나타내는 아래첨자이다.

  • "#user.id": 매개변수 사용자의 id 속성을 가져옵니다. 여기서 사용자는 매개변수 목록의 매개변수 이름과 일치해야 합니다

  • "#result.id": 반환 값에서 id 속성을 가져옵니다.

  • Spring Cache 소스 코드에서: 메서드를 만드는 데 사용되는 SpEL(Spring Expression Language) 표현식🎜🎜요구 사항에 대한 @Cacheable 주석에는 일반적으로 사용되는 여러 속성이 있습니다. 속성 설정: 🎜
    • 🎜value: 캐시 이름, 각 캐시 이름은 여러 키를 가질 수 있습니다. 🎜
    • 🎜key: 캐시 키. 🎜
    • 🎜조건: 조건부 판단, 조건이 충족되면 데이터를 캐시합니다. Redis에서는 이 매개변수가 유효하지 않다는 점에 유의할 가치가 있습니다🎜
    • 🎜"unless" 매개변수는 다음과 같습니다. 특정 조건이 충족되면 데이터 캐싱을 피하기 위해 Redis에서 조건문으로 사용됩니다.🎜
    @Slf4j
    @SpringBootApplication
    @ServletComponentScan
    @EnableCaching
    public class ReggieApplication {
        public static void main(String[] args) {
            SpringApplication.run(ReggieApplication.class, args);
            log.info("springBoot项目启动成功……");
        }
    }
    🎜2.3, @CachePut🎜🎜@CachPut 주석은 주로 반환 값을 반환합니다. 메소드의 캐시에 넣습니다. 여기서 SpEL은 일반적으로 사용되는 속성은 다음과 같습니다. 🎜
    • 🎜값: 각 캐시 이름은 여러 키를 가질 수 있습니다.
    • 🎜key: 캐시된 키. 🎜
    • 🎜조건: 조건부 판단, 조건이 충족되면 데이터를 캐시합니다. Redis에서는 이 매개변수가 유효하지 않다는 점에 유의할 가치가 있습니다🎜
    • 🎜"unless" 매개변수는 다음과 같습니다. 특정 조건이 충족되는 경우 데이터 캐싱을 피하기 위해 Redis에서 조건문으로 사용됩니다.🎜
    /**
     * @description 新增套餐信息
     * @author xBaozi
     * @date 17:55 2022/5/13
     * @param setmealDto    需要新增套餐的数据
     **/
    @CacheEvict(value = "setmealCache",allEntries = true)
    @PostMapping
    public Result<String> save(@RequestBody SetmealDto setmealDto) {
        log.info("套餐信息为{}", setmealDto);
        setmealService.saveWithDish(setmealDto);
        return Result.success("套餐" + setmealDto.getName() + "新增成功");
    }
    🎜2.4, @CacheEvict🎜🎜@CacheeEvict는 주로 하나 이상의 조각을 캐시합니다. of data 캐시에서 삭제하고 SpEL을 사용하여 데이터를 얻습니다. 일반적으로 사용되는 속성은 다음과 같습니다. 🎜
    • 🎜값: 캐시 이름, 각 캐시 이름 여러 개의 키를 가질 수 있습니다🎜
    • 🎜key: 캐시된 키입니다. 🎜
    • 🎜조건: 조건부 판단, 조건이 충족되면 데이터를 캐시합니다. Redis에서는 이 매개변수가 유효하지 않다는 점에 유의할 가치가 있습니다🎜
    • 🎜"unless" 매개변수는 다음과 같습니다. 특정 조건이 충족되면 데이터 캐싱을 피하기 위해 Redis에서 조건문으로 사용됩니다.🎜
    /**
     * @description 更新套餐信息并更新其关联的菜品
     * @author xBaozi
     * @date 11:28 2022/5/14
     * @param setmealDto    需要更新的套餐信息
     **/
    @CacheEvict(value = "setmealCache",allEntries = true)
    @PutMapping
    public Result<String> updateWithDish(@RequestBody SetmealDto setmealDto) {
        log.info(setmealDto.toString());
        setmealService.updateWithDish(setmealDto);
        return Result.success("套餐修改成功");
    }

    3. Redis를 캐싱 제품으로 사용

    🎜Spring의 기본 캐싱 기술은 다음과 같습니다. 내구성이 없음 캐시 데이터는 자동으로 저장됩니다. 즉, 서비스가 중단되면 캐시도 중단되므로 Redis를 사용하여 작업해야 합니다(사실 Redis를 배웠기 때문이기도 합니다) 🎜🎜이전 SpringBoot 통합 Redis 캐시 확인 코드는 Redis의 일부 기본 작업을 기록합니다. 🎜🎜3.1, 좌표 가져오기🎜🎜Maven 좌표 가져오기: spring-boot-starter-data-redis, spring-boot-starter-cache🎜rrreee🎜3.2, yml 구성🎜
    🎜spring:
    redis: 호스트: localhost
    포트: 6379
    비밀번호: 123456
    데이터베이스: 0
    캐시:
    redis:
    TTL(Time-To-Live): 1800000 # 캐시 유효 기간을 설정하세요🎜
    🎜3.3. 주석 기능을 활성화하세요🎜🎜캐시 주석 기능을 활성화하려면 시작 클래스 com/itheima/CacheDemoApplication.java에 @EnableCaching 주석을 추가하세요🎜 rrreee🎜3.4. @Cacheable🎜🎜을 사용하세요. 캐시를 사용할 때 반환 값은 직렬화 가능 직렬화 인터페이스를 구현해야 한다는 점을 기억해야 합니다. 그렇지 않으면 오류가 발생합니다. 🎜🎜NoSql 데이터베이스에는 Java 기본 유형에 해당하는 데이터 구조가 없기 때문에 NoSql 데이터베이스에 저장할 때 객체를 직렬화해야 하며 동시에 네트워크 중에 두 가지에 주의해야 합니다. 각 애플리케이션의 javabeans의 serialVersionUID가 일관되어야 합니다. 그렇지 않으면 deserialization이 정상적으로 수행될 수 없습니다. 🎜rrreee🎜3.5, @CacheEvict🎜🎜 사용 새 속성은 allEntries라고 하며, 이는 캐시의 모든 요소를 ​​지워야 하는지 여부를 나타내는 데 사용되는 부울 유형입니다. 기본값은 false이며 이는 필요하지 않음을 의미합니다. allEntries가 true로 설정되면 Spring Cache는 지정된 키를 고려하지 않습니다. 때로는 요소를 하나씩 지우는 것보다 모든 요소를 ​​한 번에 지우고 캐시하는 것이 더 효율적일 때도 있습니다. 🎜
    /**
     * @description 更新套餐信息并更新其关联的菜品
     * @author xBaozi
     * @date 11:28 2022/5/14
     * @param setmealDto    需要更新的套餐信息
     **/
    @CacheEvict(value = "setmealCache",allEntries = true)
    @PutMapping
    public Result<String> updateWithDish(@RequestBody SetmealDto setmealDto) {
        log.info(setmealDto.toString());
        setmealService.updateWithDish(setmealDto);
        return Result.success("套餐修改成功");
    }

    4、测试

    代码编写完成之后,重启工程,然后访问后台管理系统,对套餐数据进行新增以及删除,而后观察Redis中的数据发现写的代码是能正常跑到!成功!

    SpringBoot가 Spring Cache를 통합하여 Redis 캐싱을 구현하는 방법

    위 내용은 SpringBoot가 Spring Cache를 통합하여 Redis 캐싱을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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