기술나눔

SpringBoot는 Read Through 모드를 구현합니다.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

소개

Read Through 모드는 일반적으로 응용 프로그램이 데이터 읽기를 시도할 때 캐시 시스템을 먼저 검사하여 데이터가 이미 캐시에 있는지 확인하는 캐싱 전략을 나타냅니다. 데이터가 캐시에 존재하는 경우(즉, 캐시 적중) 캐시에서 직접 데이터를 읽어 애플리케이션에 반환합니다. 데이터가 캐시에 없으면(즉, 캐시 누락) 기본 데이터 저장소(예: 데이터베이스)에서 데이터를 읽은 다음 캐시에 로드하고 마지막으로 애플리케이션에 반환합니다.

이 모델의 주요 장점은 다음과 같습니다.

  1. 성능 향상: 기본 스토리지에 대한 직접 액세스 횟수를 줄임으로써 데이터 검색 성능을 크게 향상시킬 수 있습니다.
  2. 대기 시간 감소: 캐시는 일반적으로 메모리에 위치하며 디스크 스토리지보다 훨씬 빠르게 액세스할 수 있으므로 데이터 검색 대기 시간이 줄어듭니다.
  3. 데이터베이스 부하 감소: 자주 액세스하는 데이터를 캐시에 저장함으로써 데이터베이스에 대한 쿼리 부담을 줄여 전체 시스템의 처리량을 향상시킬 수 있습니다.

Read Through 모드는 일반적으로 Lazy Loading 및 Eager Loading과 같은 전략과 대조됩니다.

  • 레이지 로딩: 데이터는 필요할 때만 로드되므로 불필요한 데이터 로드는 줄어들지만 첫 번째 액세스 시 지연 시간이 늘어날 수 있습니다.
  • 열망 로딩: 데이터를 미리 로드하면 첫 번째 액세스 대기 시간을 줄일 수 있지만 애플리케이션의 메모리 사용량과 시작 시간이 늘어날 수 있습니다.

Read Through 모드를 구현할 때 다음 사항을 고려할 수 있습니다.

  • 캐시 무효화 전략: 시간 기반(TTL) 또는 공간 기반(캐시가 특정 크기에 도달할 때) 등 캐시에서 데이터를 제거할 시기를 결정합니다.
  • 동시성 제어: 여러 애플리케이션 인스턴스가 동시에 캐시에 접근하고 수정하는 상황을 처리합니다.
  • 데이터 일관성: 특히 데이터가 업데이트될 때 캐시의 데이터가 기본 스토리지의 데이터와 일치하는지 확인하세요.

성취하다

Spring Boot에서 Read Through 패턴을 구현하는 것은 일반적으로 Spring Cache 추상화를 통해 수행될 수 있습니다. Spring Cache는 다양한 캐시 구현에 걸쳐 통합 API를 제공하고 EhCache, Hazelcast, Infinispan, Redis 등과 같은 여러 캐시 솔루션을 지원합니다.

  1. 종속성 추가: 먼저 Spring Boot의 캐시 종속성과 선택한 캐시 구현 라이브러리(예: Redis)를 추가해야 합니다.

    1. <!-- Spring Boot Starter Cache -->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-cache</artifactId>
    5. </dependency>
    6. <!-- 以Redis为例,添加Redis的Spring Boot Starter -->
    7. <dependency>
    8. <groupId>org.springframework.boot</groupId>
    9. <artifactId>spring-boot-starter-data-redis</artifactId>
    10. </dependency>
  2. 캐시 주석 활성화:Spring Boot 구성 클래스에 추가@EnableCaching캐시 주석 지원을 활성화하는 주석입니다.

  3. 캐시 관리자 구성: 하나 이상 구성CacheManager, Spring Boot는 자동으로 간단한 구성을 구성합니다.CacheManager하지만 필요한 경우 더 복잡한 캐싱 전략을 구성할 수 있습니다.

    1. import org.springframework.context.annotation.Bean;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.data.redis.cache.RedisCacheConfiguration;
    4. import org.springframework.data.redis.cache.RedisCacheManager;
    5. import org.springframework.data.redis.connection.RedisConnectionFactory;
    6. @Configuration
    7. public class RedisCacheConfig {
    8. @Bean
    9. public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
    10. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
    11. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
    12. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(GenericJackson2JsonRedisSerializer.json())))
    13. Map<String, RedisCacheConfiguration> customCacheConfigs = new HashMap<>();
    14. customCacheConfigs.put("mySpecialCache",
    15. config.entryTtl(Duration.ofMinutes(15))); // 为特定缓存设置不同的过期时间
    16. .disableCachingNullValues();
    17. return RedisCacheManager.builder(connectionFactory)
    18. .cacheDefaults(config)
    19. // 在这里可以自定义添加缓存配置
    20. .withInitialCacheConfigurations(customCacheConfigs)
    21. .build();
    22. }
    23. }
  4. 캐시 주석 사용: 캐싱이 필요한 메소드에 사용됩니다.@Cacheable Read Through 모드를 구현하기 위한 주석입니다. 캐시에 데이터가 없으면 메서드가 호출되고 결과가 캐시됩니다.
    1. import org.springframework.cache.annotation.Cacheable;
    2. import org.springframework.stereotype.Service;
    3. @Service
    4. public class MyService {
    5. @Cacheable(value = "myCache", key = "#id")
    6. public MyData getDataById(String id) {
    7. // 从数据库加载数据
    8. return myDataRepository.findById(id);
    9. }
    10. }
  5. 캐시 키:존재하다@Cacheable캐시 키는 일반적으로 메소드 매개변수의 값을 기반으로 하는 주석에 지정됩니다.

  6. 캐시 이름: 서로 다른 캐시 도메인을 구별하는 데 사용될 캐시 이름을 지정합니다.

  7. 캐시 매개변수 구성: 필요에 따라 캐시 시간 초과, 조건, 제외 조건 등을 구성할 수 있습니다.

    1. 값 또는 캐시 이름 :캐시 이름을 지정합니다. 캐시를 저장하는 데 사용될 하나 이상의 캐시 이름을 지정할 수 있습니다.

      @Cacheable(value = "myCacheName", key = "#id")
    2. 열쇠 : 캐시 키 값의 생성 전략을 정의합니다. SpEL 표현식(Spring Expression Language)은 일반적으로 메소드 매개변수를 캐시 키로 지정하는 데 사용됩니다.

      @Cacheable(cacheNames = "myCache", key = "#id")
    3. 상태: 캐싱 조건을 정의하고, 조건이 충족되는 경우에만 캐싱합니다.

      @Cacheable(cacheNames = "myCache", key = "#id", condition = "#id.length() > 3")
    4. ~하지 않는 한: 캐싱하지 않는 조건을 정의하고,condition대신 특정 상황을 배제하는 데 사용됩니다.

      @Cacheable(cacheNames = "myCache", key = "#id", unless = "#result == null")
    5. 키 생성기: 사용자 정의 캐시 키 생성 전략을 지정합니다. 더 복잡한 키 생성 논리가 필요한 경우KeyGenerator콩 이름.

      @Cacheable(cacheNames = "myCache", keyGenerator = "myKeyGenerator")
    6. 캐시매니저:사용할 것을 지정하십시오CacheManager, 여러 개가 있는 경우CacheManager사용될 때.

      @Cacheable(cacheNames = "myCache", cacheManager = "myCacheManager")
    7. 쓰기 후 만료 : 캐시 항목이 작성된 후 만료 시간(밀리초)을 설정합니다. 이는 캐시된 데이터의 수명을 정의하기 위해 일반적으로 사용되는 구성입니다.

      @Cacheable(cacheNames = "myCache", key = "#id", expireAfterWrite = 3600000) // 1小时后过期
    8. 액세스 후 만료: 캐시 항목의 마지막 접근 후 만료 시간을 설정합니다. 이는 캐시 데이터에 마지막으로 접근한 후의 시간에 적합합니다.

    9. 새로 고침 후 쓰기: 쓰기 후 캐시를 새로 고치는 기간을 설정합니다. 캐시가 동적으로 새로 고쳐지는 시나리오에 적합합니다.

    10. 동조: 동시 환경에서 경합 상태를 방지하기 위해 캐시 항목을 동기적으로 생성할지 여부를 설정합니다.

  8. 예외 처리: 애플리케이션의 안정성에 영향을 미치지 않도록 캐시 메서드에서 발생할 수 있는 예외를 처리해야 합니다.