Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Deaktivieren Sie Redis bei vielen Timeouts mit Spring Boot

Wenn Sie Spring Data Redis verwenden, können Sie die Unterstützung von Spring nutzen, um diese vorübergehenden Ausfälle und Ausnahmen über einen benutzerdefinierten Ausnahmehandler zu handhaben.

Code:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Es wird empfohlen, das Timeout auf einen niedrigeren Wert als den Standardwert (60000) einzustellen:

spring.cache.type=redis
spring.redis.timeout=100

Erstellen Sie dann einen benutzerdefinierten Fehlerhandler im Spring-Kontext:

import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.Cache;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.CacheErrorHandler;
import org.springframework.context.annotation.Configuration;

@Slf4j
@EnableCaching
@Configuration
public class CacheConfiguration extends CachingConfigurerSupport {

    @Override
    public CacheErrorHandler errorHandler() {
        return new CacheErrorHandler() {
            @Override
            public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
                log.info("Failure getting from cache: " + cache.getName() + ", exception: " + exception.toString());
            }

            @Override
            public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
                log.info("Failure putting into cache: " + cache.getName() + ", exception: " + exception.toString());
            }

            @Override
            public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
                log.info("Failure evicting from cache: " + cache.getName() + ", exception: " + exception.toString());
            }

            @Override
            public void handleCacheClearError(RuntimeException exception, Cache cache) {
                log.info("Failure clearing cache: " + cache.getName() + ", exception: " + exception.toString());
            }
        };
    }

}

Spring sollte den Fehler nach 100 Millisekunden erkennen und zurückgreifen, um die über @Cacheable abgerufenen Daten abzurufen kommentierte Methoden normalerweise so, als ob es einen Cache-Miss gäbe. Und immer wenn der Cache wiederhergestellt wird, beginnt Spring wieder mit dem Pullen aus dem Cache.