Возникла проблема с кэшем Guava
Я использую Google Guava Cache + Spring для кеширования. Я пытаюсь использовать интерфейс загрузки кэша Guava для того же.
Я знаю, что Spring обеспечивает поддержку Guava Cache, но мне было интересно, смогу ли я использовать кешируемую аннотацию Spring вместе с Loading Cache?
По сути, я хотел отделить бизнес-уровень от кэша.
Пожалуйста, помогите. Благодарю.
2 ответа
Кеш Guava устарел. Если бы вы использовали существующий код, это было бы другое дело, но для нового кода используйте Caffeine.
Положить
@Cacheable("myCacheName")
на метод, который вы хотите кэшировать возвращаемое значение для.Положить
@EnableCaching
в вашем классе приложения, если используется Spring Boot, в противном случае на некоторых@Configuration
учебный класс.Установите спецификацию в
application.properties
если вы используете Spring Boot, вот так:spring.cache.caffeine.spec=maximumSize=10000,expireAfterWrite=5m
, Если вы не используете Boot, используйте@PropertySources
аннотация к тому же классу, что и в #3 выше.добавлять
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 Вы можете определить несколько кэшей загрузки для различных вариантов поведения, например, поиск пользователя, поиск статьи и т. Д.