我有一个基于Spring Boot应用程序的API,该API可以缓存具有不同时间延迟的不同方法,
@Cacheable(value = "findAllByIdType", key="#p0")
List<NomenclatureEntity> findAllByIdType(String type);
@Cacheable(value = "findByIdTypeAndIdKey", key="#p0 + #p1")
NomenclatureEntity findByIdTypeAndIdKey(String type,String key);
缓存配置:
@Configuration
@ConditionalOnExpression("${cache.enable:true}")
@EnableCaching
@EnableScheduling
public class CacheConfig {
private static final String findByIdTypeAndIdKey = "findByIdTypeAndIdKey";
private static final String findAllByIdType = "findAllByIdType";
private static final Logger LOGGER = LoggerFactory.getLogger(CacheConfig.class);
@Bean
public CacheManager cacheManager() {
ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager(findByIdTypeAndIdKey,findAllByIdType);
return cacheManager;
}
@CacheEvict(allEntries = true, value = {findByIdTypeAndIdKey})
@Scheduled(fixedDelay = 24 * 60 * 60 * 1000 , initialDelay = 500)
public void reportCacheEvict() {
LOGGER.debug("## Flush Data Cache findByIdTypeAndIdKey");
}
@CacheEvict(allEntries = true, value = {findAllByIdType})
@Scheduled(fixedDelay = 24 * 60 * 60 * 1000 , initialDelay = 500)
public void reportCacheEvict2() {
LOGGER.debug("## Flush Data Cache findAllByIdType");
}
}
该应用程序可正常运行,但我对性能表示怀疑,这是实现该目标的一种好方法(实践),还是有更好的方法?
答案 0 :(得分:0)
这取决于您的应用程序的大小。
ConcurrentMapCacheManager
顾名思义,您使用Map
来缓存数据,因此堆的内存将与缓存相同。这适合在开发期间使用,但对于生产而言,请考虑使用其他类型的缓存,例如Redis
。
对于缓存逐出,您可以像以前一样对其进行控制,或者在达到分配的内存时依靠缓存提供者逐出数据(默认情况下,Redis使用LRU (Least Recently Used)
算法来逐出数据)。