수색…


왜 캐싱인가?

오늘날 성능은 웹 서비스 / 응용 프로그램을 개발할 때 평가해야 할 가장 중요한 지표 중 하나입니다. 고객의 참여를 유지하는 것은 모든 제품에 중요하며, 이러한 이유로 성능을 향상시키고 페이지로드 시간을 줄이는 것이 매우 중요합니다.

데이터베이스와 상호 작용하는 웹 서버를 실행할 때 작업이 병목 현상이 될 수 있습니다. MongoDB도 여기 예외는 아니며 MongoDB 데이터베이스가 확장됨에 따라 상황이 실제로 느려질 수 있습니다. 데이터베이스 서버가 웹 서버에서 분리되면이 문제는 더욱 심각해질 수 있습니다. 이러한 시스템에서 데이터베이스와의 통신은 큰 오버 헤드를 초래할 수 있습니다.

다행히도, 우리는 일을 빠르게하기 위해 캐싱이라는 방법을 사용할 수 있습니다. 이 예제에서는이 메소드를 사용하여 스프링 캐시, 스프링 데이터 및 Redis를 사용하여 애플리케이션의 성능을 향상시키는 방법을 설명합니다.

기본 시스템

첫 번째 단계로서 MongoDB에 데이터를 저장하는 기본 웹 서버를 구축 할 것입니다. 이 데모에서는 "빠른 라이브러리"라고 이름을 지정합니다. 서버에는 두 가지 기본 작업이 있습니다.

POST /book :이 엔드 포인트는 POST /book 의 제목, 작성자 및 내용을 수신하고 데이터베이스에 책 항목을 작성합니다.

GET /book/ {title} :이 엔드 포인트는 제목을 얻고 그 내용을 반환합니다. 제목은 책을 고유하게 식별한다고 가정합니다 (따라서 동일한 제목의 도서는 두 장이 없습니다). 물론 더 나은 대안은 ID를 사용하는 것입니다. 그러나 간단하게하기 위해 제목을 사용합니다.

이것은 간단한 라이브러리 시스템이지만, 우리는 나중에 고급 능력을 추가 할 것입니다.

이제 Spring Tool Suite (Eclipse를 사용하여 빌드) 및 Spring Starter Project를 사용하여 프로젝트를 생성 해 보겠습니다.

여기에 이미지 설명을 입력하십시오.

우리는 Java를 사용하여 프로젝트를 구축하고 build하기 위해 maven을 사용하고, 값을 선택하고 다음을 클릭합니다.

여기에 이미지 설명을 입력하십시오.

웹 모듈에서 NOSQL 및 Web의 MongoDB, Redis를 선택하고 마침을 클릭하십시오. 우리는 Setters의 자동 생성 및 모델 값의 getter를 위해 Lombok을 사용하므로 POM에 Lombok 종속성을 추가해야합니다.

여기에 이미지 설명을 입력하십시오. 여기에 이미지 설명을 입력하십시오.

MongoDbRedisCacheApplication.java에는 Spring Boot Application을 실행하는 데 사용되는 main 메소드가 포함되어 있습니다.

id, 책 제목, 저자, 설명 및 @Data로 주석을 달아 모델 클래스를 작성하여 jar 프로젝트에서 자동 setter 및 getter 생성 lombok

package com.example;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import lombok.Data;
@Data
public class Book {
    @Id
    private String id;
    @Indexed
    private String title;
    private String author;
    private String description;
}

Spring Data는 우리에게 기본적으로 모든 CRUD 연산을 자동으로 생성하므로 BookRepository.Java를 생성하여 제목으로 책을 찾고 책을 삭제합니다

package com.example;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface BookRepository  extends MongoRepository<Book, String>
{
    Book findByTitle(String title);
    void delete(String title);
}

데이터를 MongoDB에 저장하고 idTitle (@PathVariable String title)에 의해 데이터를 검색하는 webservicesController를 생성 해보자.

package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebServicesController {
    @Autowired
    BookRepository repository;
    @Autowired
    MongoTemplate mongoTemplate;
    @RequestMapping(value = "/book", method = RequestMethod.POST)
    public Book saveBook(Book book) 
    {
        return repository.save(book);
    }
    @RequestMapping(value = "/book/{title}", method = RequestMethod.GET)
    public Book findBookByTitle(@PathVariable String title) 
    {
        Book insertedBook = repository.findByTitle(title);
        return insertedBook;
    }
}

캐시 추가하기 지금까지는 기본적인 라이브러리 웹 서비스를 만들었지 만, 그다지 빠르지는 않습니다. 이 절에서는 결과를 캐싱하여 findBookByTitle () 메서드를 최적화하려고 시도합니다.

이 목표를 달성하는 방법에 대해 더 잘 이해하려면 전통적인 도서관에 앉아있는 사람들의 사례로 돌아가 보겠습니다. 그들이 특정 제목의 책을 ​​찾고 싶다고합시다. 우선, 그들은 테이블을 둘러보고 이미 가져 왔는지 확인합니다. 그들이 가지고 있다면, 대단하다! 그들은 캐시에서 항목을 찾는 캐시 히트를 가졌습니다. 캐시를 찾지 못하면 캐시 미스가 발생하여 캐시에서 해당 항목을 찾지 못했습니다. 누락 된 품목의 경우 도서관에서 책을 찾아야합니다. 그들이 그것을 발견하면, 테이블에 보관하거나 캐시에 삽입합니다.

이 예제에서는 findBookByTitle () 메서드에 대해 정확히 동일한 알고리즘을 사용합니다. 특정 제목의 도서를 요청하면 캐시에서 찾을 것입니다. 발견되지 않으면, 우리는 주 기억 장치, 즉 우리의 MongoDB 데이터베이스에서 찾을 것입니다.

Redis 사용

클래스 경로에 spring-boot-data-redis를 추가하면 스프링 부트가 마법을 수행 할 수 있습니다. 자동 구성으로 필요한 모든 작업을 생성합니다.

이제 캐쉬에 아래 라인이있는 메소드에 주석을 달고 스프링 부트가 마술을하도록 해보자.

@Cacheable (value = "book", key = "#title")

레코드가 삭제 될 때 캐시에서 삭제하려면 BookRepository에서 아래 줄에 주석을 달고 Spring Boot가 캐시 삭제를 처리하게하십시오.

@CacheEvict (value = "book", key = "#title")

데이터를 업데이트하려면 메소드에 아래 줄을 추가하고 스프링 부트 핸들을 처리하도록합니다.

@CachePut(value = "book", key = "#title")

GitHub 에서 전체 프로젝트 코드를 찾을 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow