Heim  >  Artikel  >  Datenbank  >  Wie Redis+Caffeine verteilte Cache-Komponenten der zweiten Ebene implementiert

Wie Redis+Caffeine verteilte Cache-Komponenten der zweiten Ebene implementiert

WBOY
WBOYnach vorne
2023-05-30 23:10:58895Durchsuche

Der sogenannte Second-Level-Cache

Caching besteht darin, Daten von einem langsamer lesenden Medium zu lesen und sie auf einem schneller lesenden Medium, z. B. einem Festplattenspeicher, abzulegen.

Normalerweise speichern wir Daten auf Datenträgern, beispielsweise in einer Datenbank. Wenn Sie jedes Mal aus der Datenbank lesen, wird die Lesegeschwindigkeit durch die E/A der Festplatte selbst beeinflusst, sodass ein Speichercache wie bei Redis vorhanden ist. Die Daten können ausgelesen und im Speicher abgelegt werden, sodass die Daten bei Bedarf direkt aus dem Speicher zurückgegeben werden können, was die Geschwindigkeit erheblich verbessern kann.
Aber im Allgemeinen wird Redis separat in einem Cluster bereitgestellt, sodass ein Netzwerk-E/A-Verbrauch entsteht. Obwohl die Verbindung mit dem Redis-Cluster bereits über ein Tool wie einen Verbindungspool verfügt, wird dennoch ein gewisser Datenübertragungsverbrauch auftreten. Es gibt also einen In-Process-Cache, beispielsweise Koffein. Wenn der In-Application-Cache über qualifizierte Daten verfügt, können diese direkt verwendet werden, ohne dass sie über das Netzwerk von Redis abgerufen werden müssen. Dadurch entsteht ein zweistufiger Cache. Der In-Application-Cache wird als Cache der ersten Ebene bezeichnet, und der Remote-Cache (z. B. Redis) wird als Cache der zweiten Ebene bezeichnet.

  • Muss das System die CPU-Auslastung zwischenspeichern: Wenn Sie bestimmte Anwendungen haben, die viel CPU verbrauchen müssen, um zu berechnen und Ergebnisse zu erhalten.

  • Wenn Ihr Datenbankverbindungspool relativ inaktiv ist, sollten Sie den Cache nicht verwenden, um die E/A-Ressourcen der Datenbank zu belegen. Erwägen Sie die Verwendung von Caching, wenn der Datenbankverbindungspool ausgelastet ist oder häufig Warnungen über unzureichende Verbindungen meldet.

Vorteile des verteilten Second-Level-Cache

Redis wird zum Speichern heißer Daten verwendet, und auf Daten, die sich nicht in Redis befinden, wird direkt aus der Datenbank zugegriffen.
Haben Sie bereits Redis, warum müssen wir über Prozess-Caches wie Guava und Koffein Bescheid wissen:

  • Wenn Redis nicht verfügbar ist, können wir zu diesem Zeitpunkt nur auf die Datenbank zugreifen, was leicht zu einer Lawine führen kann, im Allgemeinen jedoch wird nicht passieren.

  • Der Zugriff auf Redis erfordert einen gewissen Netzwerk-E/A- und Serialisierungs- und Deserialisierungsaufwand. Obwohl die Leistung sehr hoch ist, ist sie nicht so schnell wie die lokale Methode, um den Zugriff weiter zu beschleunigen. Diese Idee gilt nicht nur für unsere Internetarchitektur. Wir verwenden L1-, L2- und L3-Mehrebenen-Caches in Computersystemen, um den direkten Zugriff auf den Speicher zu reduzieren und dadurch den Zugriff zu beschleunigen.

Wenn wir also nur Redis verwenden, kann es die meisten unserer Anforderungen erfüllen. Wenn wir jedoch eine höhere Leistung und eine höhere Verfügbarkeit anstreben müssen, müssen wir den mehrstufigen Cache verstehen.

Beschreibung des Datenleseprozesses des Cache-Betriebsprozesses der zweiten Ebene

Wie Redis+Caffeine verteilte Cache-Komponenten der zweiten Ebene implementiert

Wenn weder Redis noch der lokale Cache den Wert abfragen können, wird der Aktualisierungsprozess ausgelöst. Der gesamte Prozess ist eine Beschreibung des Prozesses zur Ungültigmachung des gesperrten Caches

Wie Redis+Caffeine verteilte Cache-Komponenten der zweiten Ebene implementiert

redis-Update Es wird durch das Löschen des Cache-Schlüssels ausgelöst. Wie verwende ich die Komponente nach dem Löschen des Redis-Cache?

Die Komponente wird basierend auf dem Spring Cache-Framework geändert. Um den verteilten Cache im Projekt zu verwenden, müssen Sie nur Folgendes hinzufügen: CacheManager = „L2_CacheManager“ oder CacheManager = CacheRedisCaffeineAutoConfiguration

//这个方法会使用分布式二级缓存来提供查询
@Cacheable(cacheNames = CacheNames.CACHE_12HOUR, cacheManager = "L2_CacheManager")
public Config getAllValidateConfig() { 
}

Wenn Sie möchten Wenn Sie sowohl verteilte Cache-Komponenten als auch verteilte Second-Level-Cache-Komponenten verwenden möchten, müssen Sie eine @Primary CacheManager-Bean in Spring einfügen. Cache Die .CacheManager-Schnittstelle und die Vererbung org.springframework.cache.support.AbstractValueAdaptingCache implementieren das Lesen und Schreiben des Caches unter dem Spring-Cache-Framework.

RedisCaffeineCacheManager implementiert die CacheManager-Schnittstelle

RedisCaffeineCacheManager.class verwaltet hauptsächlich Cache-Instanzen, generiert entsprechende Cache-Verwaltungs-Beans basierend auf verschiedenen CacheNames und fügt sie dann in eine Karte ein.

@Primary
@Bean("deaultCacheManager")
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
    // 生成一个默认配置,通过config对象即可对缓存进行自定义配置
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
    // 设置缓存的默认过期时间,也是使用Duration设置
    config = config.entryTtl(Duration.ofMinutes(2)).disableCachingNullValues();

    // 设置一个初始化的缓存空间set集合
    Set<String> cacheNames =  new HashSet<>();
    cacheNames.add(CacheNames.CACHE_15MINS);
    cacheNames.add(CacheNames.CACHE_30MINS);

    // 对每个缓存空间应用不同的配置
    Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
    configMap.put(CacheNames.CACHE_15MINS, config.entryTtl(Duration.ofMinutes(15)));
    configMap.put(CacheNames.CACHE_30MINS, config.entryTtl(Duration.ofMinutes(30)));
  
    // 使用自定义的缓存配置初始化一个cacheManager
    RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
        .initialCacheNames(cacheNames)  // 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
        .withInitialCacheConfigurations(configMap)
        .build();
    return cacheManager;
}

RedisCaffeineCache erbt AbstractValueAdaptingCache

Der Kern ist die get-Methode und die put-Methode.

//这个方法会使用分布式二级缓存
@Cacheable(cacheNames = CacheNames.CACHE_12HOUR, cacheManager = "L2_CacheManager")
public Config getAllValidateConfig() {
}

//这个方法会使用分布式缓存
@Cacheable(cacheNames = CacheNames.CACHE_12HOUR)
public Config getAllValidateConfig2() {
}

Das obige ist der detaillierte Inhalt vonWie Redis+Caffeine verteilte Cache-Komponenten der zweiten Ebene implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen