English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Spring 프레임워크는 Spring 애플리케이션에서 투명하게 캐시를 제공합니다. Spring에서는캐시 추상화는 코드에 영향을 미치지 않고 다양한 캐시 메서드를 일관되게 사용할 수 있는 메커니즘입니다.
캐시 추상화 메커니즘은 Java 메서드주요 목적은 캐시에 존재하는 정보를 기반으로감소실행 횟수. 이는 비싼 메서드에 적용됩니다. 예를 들어 CPU 또는 IO 바인딩
메서드를 호출할 때마다 추상화는 캐시 행동을 메서드에 적용합니다. 이 메서드가 주어진 매개변수에 대해 이미 실행되었는지 확인합니다.
그렇다면, 실제 메서드를 실행하지 않고 캐시의 결과를 반환합니다.아니라면, 먼저 이 메서드를 실행하고 결과를 캐시에 저장하여 사용자에게 반환합니다.
개발자는 캐시 추상화를 처리할 때 두 가지 주의할 점이 있습니다.
캐시 선언: 캐시에 필요한 메서드를 식별합니다. 캐시 구성: 데이터 저장 및 읽기에 사용되는 대체 캐시
캐시는 일시적 메모리의 일부(RAM)입니다. 이는 애플리케이션과 유속성 데이터베이스 간에 위치합니다. 최근에 사용된 데이터를 저장하여 데이터베이스 히트 횟수를 최소화합니다. 다시 말해, 캐시는 미래에 참조할 수 있는 데이터를 저장하기 위한 것입니다.
캐시를 사용하는 주요 이유는 데이터 접근이 더 빠르고 저렴하게 하는 것입니다. 여러 번 요청되는 고도로 요청되는 자원을 다루는 경우, 개발자에게는 캐시 자원이 빠르게 응답을 제공할 수 있어 유익합니다. 애플리케이션에서 캐시를 사용하면 애플리케이션의 성능을 향상시킬 수 있습니다. 데이터베이스에서 데이터를 가져오는 것보다 메모리에서 데이터 접근은 항상 더 빠릅니다. 이는 금전 비용과 기회 비용을 줄입니다.
빈번히 변경되지 않는 데이터빈번히 변경되지 않는 읽기 쿼리로, 이 쿼리 결과는 각 호출에서 최소한 일정 기간 동안 변하지 않습니다.
가 있습니다چه 네 가지캐시 타입은 다음과 같습니다:
메모리 내 캐시데이터베이스 캐시 입니다. 가장 인기 있는 데이터베이스 캐시는 Hibernate의 일급 캐시입니다. 의 메커니즘입니다. 예를 들어, 웹 서버에서 제공하는 웹 페이지의 복사본이 있습니다. 사용자가 첫 번째로 페이지에 접근할 때 그것을 캐시에 저장합니다. 사용자가 다음에 동일한 내용을 요청할 때, 캐시가 페이지의 복사본을 제공합니다. 이렇게 하면 서버의 부담을 줄일 수 있습니다. 웹 서버 캐시는 페이지 전달 속도를 향상시키고, 백엔드 서버가 수행해야 할 작업을 줄일 수 있습니다.
메모리 캐시는 애플리케이션의 성능을 향상시킬 수 있습니다. 이는 자주 사용되는 영역입니다. Memcached 와 Redis 메모리 내 캐시의 예입니다. 이는 애플리케이션과 데이터베이스 간에 키밸류를 저장합니다. Redis는메모리 내, 분산고급 캐시 도구로 백업 및 복원 기능을 사용할 수 있습니다. 또한 분산 클러스터에서 캐시를 관리할 수 있습니다.
데이터베이스 캐시데이터베이스 캐시는 데이터를 요청에 따라(동적으로) 웹 페이지를 생성하는 메커니즘입니다. 데이터베이스에서. 그것은 클라이언트, 웹 애플리케이션 서버, 데이터베이스를 포함한多层환경에서 사용됩니다. 쿼리 작업 부담을 분산하여와확장성성능
웹 서버 캐시웹 서버 캐시는 데이터를 저장하여재사용
CDN 캐시 CDNCDN을 대표합니다.콘텐츠 전달 네트워크입니다. 이것은 현대 웹 애플리케이션에서 사용하는 구성 요소입니다. 그것은복사보통 파일(예: HTML 페이지, 스타일 시트), 그것은 내용 전달을 개선할 수 있습니다. JavaScript, 이미지, 비디오 등)은 전 세계적으로 분포된
캐시 서버에서.이것이 CDN가 점점 더 인기가 높아지는 이유입니다. CDN은 애플리케이션 소스의 부담을 줄이고, 사용자 경험을 개선합니다. 그것은 근처의캐시 경계(최종 사용자에 가까운 캐시 서버) 또는존재점(PoP)
캐시 | 캐시와 버퍼는 |
버퍼에 기반하여캐시는。 | 캐시는최근에 사용된 것을 가장 먼저 제거하는 |
버퍼는 | 先进先出/그것은 페이지 캐시의 크기입니다. |
O 버퍼.그것은 메모리 내의 원시 블록 I단기 | O 버퍼.그것은 매우 오래 살아갑니다단기 |
캐시에서 읽습니다기간.。 | 캐시에서 읽습니다쓰기우리는 |
그것은 버퍼에 저장합니다.실제파일 데이터. | 그것은 파일을 저장합니다.메타데이터。 |
그것을 향상시킵니다. 읽기 성능을 향상시킬 수 있습니다. | 그것을 향상시킵니다.쓰기성능을 향상시킬 수 있습니다. |
이는 클래스 레벨의 어노테이션입니다. 우리는 @EnableCaching 어노테이션을 통해 Spring Boot 애플리케이션에서 캐시를 활성화합니다.그것은 org.springframework.cache.annotation 패키지에서 정의됩니다. 그것은 @Configuration 로 사용됩니다.
CacheManager 인스턴스가 정의되지 않았다면, 자동 설정이 캐시를 활성화하고 설정 CacheManager 캐시 제공자를 스캔하면, 찾지 못하면 동기화된 HashMap이 메모리 내 캐시를 생성합니다.
예시
다음 예제에서는 캐싱을 활성화 불러오기 메커니즘을 활성화하는 어노테이션입니다.
@SpringBootApplication 캐싱을 활성화 public class SpringBootCachingApplication { public class SpringBootCacheExampleApplication { SpringApplication.run(SpringBootCachingApplication.class, args); } }
이는 클래스 수준의 어노테이션으로, 캐시와 관련된 일반 설정을 제공합니다. 그것은 Spring이 클래스의 캐시를 어디에 저장할지를 알립니다. 클래스에 어노테이션을 추가할 때, 그것은 클래스에서 정의된 모든 캐시 작업에 대한 기본 설정을 제공합니다. 어노테이션을 사용하면 여러 번 선언할 필요가 없습니다.
예시
다음 예제에서직원는 캐시 이름입니다.
@CacheConfig(cacheNames={"employee"}) public class UserService { //some code }
두 어노테이션을 동시에 필요한 경우 @CachePut 또는 @CacheEvict 을 사용할 때는 동일한 메서드를 사용합니다. 다시 말해, 우리가 동일한 타입의 여러 어노테이션을 사용하려고 할 때는
하지만 Java는 동일한 선언에 동일한 타입의 여러 어노테이션을 할당할 수 없습니다메서드. @Caching 어노테이션을 사용했습니다.
예시
다음 예제에서 우리는 어노테이션 @Caching 그리고 모든 @CacheEvict 어노테이션 그룹.
@Caching(evict = {@CacheEvict("phone_number"), @CacheEvict(value="directory", key="#student.id")})public String getAddress(Student student) { //some code }
그것은 메서드 수준의 어노테이션입니다. 메서드의 반환 값을 캐시로 정의합니다. Spring 프레임워크는 어노테이션 속성에 지정된 캐시에 대한 요청과 응답을 관리합니다. @Cacheable 어노테이션에는 더 많은 옵션이 포함됩니다. 예를 들어, 우리는 value 또는 cacheNames 속성을 제공할 수 있습니다.캐시 이름。
우리는 어노테이션의 key 속성을 사용하여 캐시 내의 각 항목을 유일하게 식별할 수 있습니다. 키가 지정되지 않으면, Spring은 기본 메커니즘을 사용하여 키를 생성합니다.
예시
다음 예제에서 우리는 < cacheStudentInfo,와 id 내부의 메서드 studentInfo()의 반환 값은 유일한 키이며, 캐시를 식별하는 데 사용됩니다.
@Cacheable(value="cacheStudentInfo", key="#id")public List studentInfo() { //some code return studentDetails; }
우리는 condition 속성을 사용하여 어노테이션에 조건을 적용할 수 있습니다. 어노테이션에 조건을 적용할 때, 그것은조건 캐시。
예를 들어, 파라미터 이름의 길이가 짧다면20이면 다음 메서드를 캐시에 저장합니다.
@Cacheable(value="student", condition="#name.length<20) public Student findStudent(String name) { //some code }
메서드 레벨 어노테이션입니다. 우리가 캐시에서 오래된이나 사용되지 않은 데이터를 제거하려 할 때 사용합니다. 여기에는 영향을 받는 캐시가 하나 이상 필요합니다. 또한 키나 조건을 지정할 수 있습니다. 넓은 캐시 제거를 위해 @CacheEvict 어노테이션은 " allEntries 의 매개변수로 사용됩니다. 그것은 키에 따라 항목을 제거하는 대신 모든 항목을 제거합니다.
@CacheEvict 어노테이션에 대해 중요한 점은 void 메서드와 함께 사용할 수 있다는 것입니다. 이 메서드는 트리거로서 역할을 합니다. 반환 값을 피합니다. 반면에 @Cacheable 어노테이션은 반환 값을 필요로 하며, 이 반환 값은 캐시에 추가/@CacheEvict 어노테이션을 사용하여 캐시 데이터를 업데이트할 수 있습니다. 다음과 같이 사용할 수 있습니다:
전체 캐시를 제거합니다:
@CacheEvict(allEntries=true)
키를 통해 항목을 제거합니다:
@CacheEvict(key="#student.stud_name")
예시
아래와 같은 어노테이션을 포함한 메서드는 캐시에서 student_data 에서 모든 데이터를 지우습니다.
@CacheEvict(value="student_data", allEntries=true) //캐시에서 모든 항목을 제거합니다 public String getNames(Student student) { //some code }
메서드 레벨 어노테이션입니다. 우리가업데이트캐시를 저장하면서 메서드 실행을 방해하지 않을 때 사용합니다. 이는 이 메서드가 항상 실행되고 그 결과를 캐시에 저장하는 것을 의미합니다. 그것은 @Cacheable 어노테이션의 속성을 지원합니다.
주의해야 할 것은 @Cacheable와 @CachePut 어노테이션의 동작이 다르기 때문에 다릅니다. @Cacheable와 @CachePut 어노테이션 간의 미세한 차이는 " Cacheable 비고메서드 실행을 건너뜁니다그리고 @CachePut 비고이 메서드를 실행합니다그런 다음 결과를 캐시에 저장합니다.
예시
이 메서드는 캐시 자체를 업데이트합니다.
@CachePut(cacheNames="employee", key="#id") //업데이트 캐시 퍼블릭 인재 업데이트 인재(ID id, 인재데이터 data) { //some code }
Spring Boot 애플리케이션에서 캐시 메커니즘을 활성화하려면 pom.xml 파일에 캐시 의존성을 추가해야 합니다. 이는 캐시를 활성화하고 CacheManager를 구성합니다.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
Spring Boot 애플리케이션을 생성하고 캐시 메커니즘을 구현합니다.
단계1: Spring Initializr http://start.spring.io .
단계2: Spring Boot 버전을 선택하세요 2.3.0.M1。
단계2: 제공群组名称. 우리는 에서 codebox.controller 이름의 패키지를 생성합니다3codebox.
단계3: 제공工件 ID. 우리는 spring-boot-cache-example.
단계5: 添加依赖项 Spring Web 와 Spring Cache 추상화.
단계6: 单击 Generate (生成) 버튼을 클릭하면, 그것은 Jar 中,그리고 로컬 시스템에 다운로드하세요。
단계7: 文件 Jar 파일을 선택하고 STS 작업 공간에 붙여넣습니다.
단계8: 导入 STS의 프로젝트 폴더.
文件->导入->现有Maven项目->浏->선택文件夹spring-boot-cache-example->완료
导入에 시간이 걸립니다.
오픈해주세요. pom.xml 文件,봐보세요. 이미 추가한 의존성이 무엇인지 확인했습니다.
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.M1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.w3codebox</groupId> <artifactId>spring-boot-cache-example</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-cache-example</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
단계9: 열기 SpringBootCacheExampleApplication.java 파일을 추가하여 주석을 추가하면 됩니다 @EnableCaching 사용하여 캐시를 활성화합니다。
SpringBootCacheExampleApplication.java package com.w3codebox; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; @SpringBootApplication //@SpringBootApplication 캐싱을 활성화 @EnableCaching { public class SpringBootCacheExampleApplication { public static void main(String[] args) } }
단계10: SpringApplication.run(SpringBootCacheExampleApplication.class, args); 에서 codebox.controller 이름의 패키지를 생성합니다3이름이 文件夹/src/main codebox.model의 폴더
단계11: 패키지를 생성합니다. 모델 패키지에서 이름이 Customer
세 개의 클래스를 정의하고 다음 내용을 정의합니다:accountno, customername, accounttype와balance。>생성자를 사용하여 생성생성자 。
파일을 우클릭하세요->원본->필드를 사용하여 생성자 생성->전체 선택->생성생성Getters and Setters。
파일을 우클릭하세요->원본->getter와 설정자 생성->전체 선택->생성
Customer.java
package com.w3codebox.model; public class Customer { private int accountno; private String customername; private String accounttype; private double balance; public Customer(int accountno, String customername, String accounttype, double balance) { this.accountno = accountno; this.customername = customername; public void setAccounttype(String accounttype) public void setBalance(double balance) } public int getAccountno() { return accountno; } public void setAccountno(int accountno) { this.accountno = accountno; } public String getCustomername() { return customername; } public void setCustomername(String customername) { this.customername = customername; } public String getAccounttype() { public String getAccounttype() } return accounttype; { public void setAccounttype(String accounttype) } this.accounttype = accounttype; { public double getBalance() } return balance; { public void setBalance(double balance) } }
단계11: this.balance = balance; 文件夹/src/main java 에서 codebox.controller 이름의 패키지를 생성합니다3com.w
단계12: Controller 패키지에서 codebox.controller 이름의 패키지를 생성합니다 CustomerController 의 컨트롤러 클래스로 지정하고 다음 작업을 수행합니다:
애너테이션을 사용하여 @RestController를 사용하여 클래스를 Controller 。 애너테이션을 사용하여 @RequestMapping을 사용하여 컨트롤러에 맵핑을 정의합니다맵핑。이미 맵핑을 정의했습니다/customerinfo 。생성캐시애너테이션을 사용하여 @Cacheable을 통해 데이터를 가져옵니다. 애너테이션을 사용하여 데이터를 가져오기 위해 이미 value 속성에서 캐시 이름을 정의했습니다.우리는에 두 개의 고객 상세 정보를 추가했습니다
CustomerController.java
package com.w3codebox.controller; import java.util.Arrays; import java.util.List; import org.springframework.cache.annotation.Cacheable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.w3codebox.model.Customer; @RestController public class CustomerController { @RequestMapping("/customerinfo") //메서드의 반환 값을 캐시로 정의합니다. @Cacheable(value="customerInfo") public List customerInformation() { System.out.println("cache에서 고객 정보 출력"); //List에 고객 상세 정보 추가 List detail=Arrays.asList(new Customer(5126890,"Charlie Puth","Current A/c", 450000.00), new Customer(7620015,"Andrew Flintoff","Saving A/c", 210089.00) ); return detail; } }
이제 이 애플리케이션을 실행합니다.
단계13: 열기 SpringBootCacheExampleApplication.java 파일을 Java 애플리케이션으로 실행합니다.
단계14: 열기PostmanURL http:을 포함하여 전송 //locahost: 8080/custmerinfo GET 요청. 고객 상세 정보를 다음과 같이 반환합니다.