2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Der Read-Through-Modus bezieht sich im Allgemeinen auf eine Caching-Strategie, bei der beim Versuch einer Anwendung, Daten zu lesen, zunächst das Cache-System überprüft wird, um festzustellen, ob sich die Daten bereits im Cache befinden. Wenn die Daten im Cache vorhanden sind (d. h. Cache-Treffer), werden die Daten direkt aus dem Cache gelesen und an die Anwendung zurückgegeben. Wenn die Daten nicht im Cache vorhanden sind (z. B. ein Cache-Fehler), werden die Daten aus dem zugrunde liegenden Datenspeicher (z. B. einer Datenbank) gelesen, dann in den Cache geladen und schließlich an die Anwendung zurückgegeben.
Zu den Hauptvorteilen dieses Modells gehören:
Der Read-Through-Modus steht normalerweise im Gegensatz zu Strategien wie Lazy Loading und Eager Loading:
Bei der Implementierung des Read-Through-Modus sollten Sie Folgendes berücksichtigen:
Die Implementierung des Read Through-Musters in Spring Boot kann normalerweise über die Spring Cache-Abstraktion erfolgen. Spring Cache bietet eine einheitliche API für verschiedene Cache-Implementierungen und unterstützt mehrere Cache-Lösungen wie EhCache, Hazelcast, Infinispan, Redis usw.
Abhängigkeiten hinzufügen: Zuerst müssen Sie die Cache-Abhängigkeiten von Spring Boot und die ausgewählte Cache-Implementierungsbibliothek (z. B. Redis) hinzufügen.
- <!-- Spring Boot Starter Cache -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-cache</artifactId>
- </dependency>
-
- <!-- 以Redis为例,添加Redis的Spring Boot Starter -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
Cache-Anmerkungen aktivieren:Fügen Sie die Spring Boot-Konfigurationsklasse hinzu@EnableCaching
annotation, um die Unterstützung für Cache-Annotationen zu aktivieren.
Cache-Manager konfigurieren: Konfigurieren Sie eine oder mehrereCacheManager
, Spring Boot konfiguriert automatisch eine einfacheCacheManager
, aber Sie können bei Bedarf komplexere Caching-Strategien konfigurieren.
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.data.redis.cache.RedisCacheConfiguration;
- import org.springframework.data.redis.cache.RedisCacheManager;
- import org.springframework.data.redis.connection.RedisConnectionFactory;
-
- @Configuration
- public class RedisCacheConfig {
-
- @Bean
- public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
- RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
- .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
- .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(GenericJackson2JsonRedisSerializer.json())))
-
- Map<String, RedisCacheConfiguration> customCacheConfigs = new HashMap<>();
- customCacheConfigs.put("mySpecialCache",
- config.entryTtl(Duration.ofMinutes(15))); // 为特定缓存设置不同的过期时间
-
- .disableCachingNullValues();
- return RedisCacheManager.builder(connectionFactory)
- .cacheDefaults(config)
- // 在这里可以自定义添加缓存配置
- .withInitialCacheConfigurations(customCacheConfigs)
- .build();
- }
- }
@Cacheable
Anmerkungen zur Implementierung des Read-Through-Modus. Befinden sich keine Daten im Cache, wird die Methode aufgerufen und das Ergebnis zwischengespeichert.- import org.springframework.cache.annotation.Cacheable;
- import org.springframework.stereotype.Service;
-
- @Service
- public class MyService {
-
- @Cacheable(value = "myCache", key = "#id")
- public MyData getDataById(String id) {
- // 从数据库加载数据
- return myDataRepository.findById(id);
- }
- }
Cache-Schlüssel:existieren@Cacheable
Der Cache-Schlüssel wird in der Annotation angegeben, die normalerweise auf dem Wert des Methodenparameters basiert.
Cache-Name: Geben Sie den Cache-Namen an, der zur Unterscheidung verschiedener Cache-Domänen verwendet wird.
Konfigurieren Sie Cache-Parameter: Sie können das Cache-Timeout, die Bedingungen, die Ausnahmebedingungen usw. nach Bedarf konfigurieren
Wert oder CacheNames : Cache-Namen angeben. Sie können einen oder mehrere Cache-Namen angeben, die zum Speichern des Caches verwendet werden.
@Cacheable(value = "myCacheName", key = "#id")
Schlüssel : Definieren Sie die Generierungsstrategie für Cache-Schlüsselwerte. SpEL-Ausdrücke (Spring Expression Language) werden normalerweise verwendet, um Methodenparameter als Cache-Schlüssel anzugeben.
@Cacheable(cacheNames = "myCache", key = "#id")
Zustand: Definieren Sie die Bedingungen für das Caching und führen Sie den Cache nur dann durch, wenn die Bedingungen erfüllt sind.
@Cacheable(cacheNames = "myCache", key = "#id", condition = "#id.length() > 3")
es sei denn: Definieren Sie die Bedingungen für das Nicht-Caching undcondition
Vielmehr dient es dazu, bestimmte Situationen auszuschließen.
@Cacheable(cacheNames = "myCache", key = "#id", unless = "#result == null")
Schlüsselgenerator: Geben Sie eine benutzerdefinierte Strategie zur Cache-Schlüsselgenerierung an. Wenn Sie eine komplexere Schlüsselgenerierungslogik benötigen, können Sie eine angebenKeyGenerator
Bohnenname.
@Cacheable(cacheNames = "myCache", keyGenerator = "myKeyGenerator")
CacheManager:Geben Sie an, welches verwendet werden sollCacheManager
, wenn es mehrere gibtCacheManager
wenn benutzt.
@Cacheable(cacheNames = "myCache", cacheManager = "myCacheManager")
Ablauf nach Schreiben : Legen Sie die Ablaufzeit (in Millisekunden) fest, nachdem das Cache-Element geschrieben wurde. Dies ist eine häufig verwendete Konfiguration, um die Lebensdauer zwischengespeicherter Daten zu definieren.
@Cacheable(cacheNames = "myCache", key = "#id", expireAfterWrite = 3600000) // 1小时后过期
Ablauf nach Zugriff: Legen Sie die Ablaufzeit nach dem letzten Zugriff auf das Cache-Element fest. Sie bestimmt, wie lange es dauert, bis die zwischengespeicherten Daten nach dem letzten Zugriff ablaufen.
Aktualisieren nach dem Schreiben: Legen Sie fest, wie lange der Cache nach dem Schreiben aktualisiert werden soll. Dies eignet sich für Szenarien, in denen der Cache dynamisch aktualisiert wird.
synchronisieren: Legen Sie fest, ob Cache-Elemente synchron erstellt werden sollen, um Race Conditions in gleichzeitigen Umgebungen zu verhindern.
Ausnahmebehandlung: Stellen Sie sicher, dass Sie Ausnahmen behandeln, die möglicherweise in Cache-Methoden ausgelöst werden, um eine Beeinträchtigung der Stabilität der Anwendung zu vermeiden.