Как кешировать данные за определенное время Spring Boot Rest Template - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь найти способ кэширования некоторых данных за определенный период времени.

Мне известно о аннотации @Cachable, однако я не нашел способа очистить кэш после некоторого времениопределенный период времени.

@GetMapping("/{lang}.{format}")
@Timed
public ResponseEntity<Object> getLocalizedMessages(@PathVariable String lang,
                                                   @PathVariable String format,
                                                   @RequestParam("buildTimestamp") long buildTimestamp) throws InvalidArgumentException {

    Map<String, Object> messages = this.localeMessageService.getMessagesForLocale(lang);
    if (FORMAT_JSON.equals(format)) {
        String jsonMessages = new PropertiesToJsonConverter().convertFromValuesAsObjectMap(messages);
        return new ResponseEntity<>(jsonMessages, HttpStatus.OK);
    }
    return new ResponseEntity<>(messages, HttpStatus.OK);
}

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

1 Ответ

0 голосов
/ 20 декабря 2018

Абстракция кеша Spring не предоставляет хранилище кеша.Конфигурация CacheManager необходима для настройки фактического хранилища.

Вот пример реализации с использованием Guava, который поддерживает выселение на основе времени:

Добавление зависимости от guava

Maven:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>27.0-jre</version>
</dependency>

Gradle:

 compile 'com.google.guava:guava:27.0-jre'

Добавьте класс для настройки кэширования

import com.google.common.cache.CacheBuilder;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.cache.interceptor.SimpleKeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager() {
            @Override
            protected Cache createConcurrentMapCache(final String name) {
                return new ConcurrentMapCache(name, CacheBuilder.newBuilder()
                        // You can customize here the eviction time
                        .expireAfterWrite(1, TimeUnit.HOURS)
                        .build()
                        .asMap(),
                        false);
            }
        };
    }

    @Bean
    public KeyGenerator keyGenerator() {
        return new SimpleKeyGenerator();
    }
}

Наконец, добавьте аннотацию @Cacheable("CacheName") к методу, для которого вы хотите получить результатыбыть кэшированным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...