Обмен технологиями

SpringBoot реализует режим чтения.

2024-07-12

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

Введение

Режим сквозного чтения обычно относится к стратегии кэширования, при которой, когда приложение пытается прочитать данные, сначала проверяется система кэширования, чтобы определить, присутствуют ли данные уже в кэше. Если данные существуют в кеше (т. е. попадание в кеш), данные считываются непосредственно из кеша и возвращаются в приложение. Если данные не существуют в кеше (т. е. промах в кеше), данные считываются из базового хранилища данных (например, базы данных), затем загружаются в кеш и, наконец, возвращаются в приложение.

К основным преимуществам данной модели относятся:

  1. Повысить производительность: Производительность извлечения данных можно значительно улучшить за счет уменьшения количества прямых обращений к базовому хранилищу.
  2. Уменьшите задержку: Кэш обычно находится в памяти, и доступ к нему осуществляется гораздо быстрее, чем к дисковому хранилищу, что снижает задержку извлечения данных.
  3. Уменьшите нагрузку на базу данных: Сохраняя часто используемые данные в кэше, можно снизить нагрузку на базу данных, тем самым повышая пропускную способность всей системы.

Режим чтения обычно противопоставляется таким стратегиям, как отложенная загрузка и быстрая загрузка:

  • Ленивая загрузка: данные загружаются только при необходимости, что уменьшает ненужную загрузку данных, но может увеличить задержку при первом доступе.
  • Активная загрузка: Предварительная загрузка данных, которая может уменьшить задержку при первом доступе, но может увеличить использование памяти вашим приложением и время запуска.

При реализации режима чтения вы можете принять во внимание следующее:

  • Стратегия аннулирования кэша: Определите, когда удалять данные из кэша, например, по времени (TTL) или по пространству (когда кэш достигает определенного размера).
  • Управление параллелизмом: обработка ситуации, когда несколько экземпляров приложения одновременно обращаются к кэшу и изменяют его.
  • согласованность данных: Убедитесь, что данные в кэше соответствуют данным в базовом хранилище, особенно при обновлении данных.

выполнить

Реализация шаблона Read Through в Spring Boot обычно может быть выполнена с помощью абстракции 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.@EnableCachingannotation, чтобы включить поддержку аннотаций кэша.

  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 Аннотации для реализации режима чтения. Если в кеше нет данных, будет вызван метод и результат будет закеширован.
    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) обычно используются для указания параметров метода в качестве ключей кэша.

      @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. истекаетAfterWrite : установите время истечения срока действия (в миллисекундах) после записи элемента кэша. Это часто используемая конфигурация для определения срока жизни кэшированных данных.

      @Cacheable(cacheNames = "myCache", key = "#id", expireAfterWrite = 3600000) // 1小时后过期
    8. expireAfterAccess: установите время истечения срока действия после последнего доступа к элементу кэша, которое соответствует тому, как долго после последнего доступа к данным кэша.

    9. обновитьAfterWrite: установите продолжительность обновления кэша после записи, что подходит для сценариев, в которых кэш обновляется динамически.

    10. синхронизировать: укажите, создавать ли элементы кэша синхронно, чтобы предотвратить условия гонки в параллельных средах.

  8. Обработка исключений: обязательно обрабатывайте исключения, которые могут быть выброшены в методах кэша, чтобы не влиять на стабильность приложения.