Возникла проблема с кэшем Guava

Я использую Google Guava Cache + Spring для кеширования. Я пытаюсь использовать интерфейс загрузки кэша Guava для того же.

Я знаю, что Spring обеспечивает поддержку Guava Cache, но мне было интересно, смогу ли я использовать кешируемую аннотацию Spring вместе с Loading Cache?

По сути, я хотел отделить бизнес-уровень от кэша.

Пожалуйста, помогите. Благодарю.

2 ответа

Решение
  1. Кеш Guava устарел. Если бы вы использовали существующий код, это было бы другое дело, но для нового кода используйте Caffeine.

  2. Положить @Cacheable("myCacheName") на метод, который вы хотите кэшировать возвращаемое значение для.

  3. Положить @EnableCaching в вашем классе приложения, если используется Spring Boot, в противном случае на некоторых @Configuration учебный класс.

  4. Установите спецификацию в application.properties если вы используете Spring Boot, вот так: spring.cache.caffeine.spec=maximumSize=10000,expireAfterWrite=5m, Если вы не используете Boot, используйте @PropertySources аннотация к тому же классу, что и в #3 выше.

  5. добавлять org.springframework.boot:spring-boot-starter-cache а также com.github.ben-manes.caffeine:caffeine в ваш файл сборки. Если вы не используете Boot, вам нужно настроить зависимости по-другому.

Вы сделали

Итак, вы хотите и масло, и варенье. Хорошо. Я помогу вам использовать загрузочный кеш наряду с сохранением логики кэширования отдельно.

Считайте, что у вас есть класс обслуживания SampleServiceImpl который реализует SampleService интерфейс.

Сервисный интерфейс:

public interface SampleService {
    User getUser(int id);
}

Внедрение сервиса:

@Service
public class SampleServiceImpl implements SampleService {

    public User getUser(int id) {
        // fetch user from database
        return user;
    }
}

Создать еще один класс SampleServiceCache

public class SampleServiceCache extends ServiceCacheImpl {

    @Autowired
    public SampleServiceCache(int expiryTime, int maximumSize) {

        loadingCache =
                CacheBuilder.newBuilder().maximumSize(maximumSize).expireAfterAccess(expiryTime, TimeUnit.HOURS).build(
                        new CacheLoader<Integer, User>() {

                            @Override
                            public User load(@Nonnull Integer userId) {
                                return SampleServiceCache.super.getUser(userId);
                            }
                        });
    }
    @Override
    public User getUser(int userId) {
        return loadingCache.getUnchecked(userId);
    }
}

В вашем конфиге bean:

@Bean
public SampleService sampleService() {
    return new SampleServiceCache(expiry, maxSize);
}

В день, когда вы хотите удалить кеш, вы должны сделать две вещи:
1. Удалите класс кеша.
2. Измените конфигурацию bean-компонента, чтобы он возвращал фактический объект реализации, а не кеш-объект реализации.

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

Другие вопросы по тегам