В следующей конфигурации мой возвращаемый объект кэшируется, но когда я пытаюсь удалить ключ вручную, он не работает.
@Configuration
@EnableCaching
public class HazelCastConfiguration {
@Bean
public HazelcastCacheManager hazelcastCacheManager() {
return new HazelcastCacheManager(Hazelcast.newHazelcastInstance(hazelcastConfig()));
}
@Bean
public Config hazelcastConfig() {
return new Config()
.setInstanceName("hazelcast-instance")
.addMapConfig(new MapConfig()
.setName("myCache")
.setMaxSizeConfig(new MaxSizeConfig())
.setEvictionPolicy(EvictionPolicy.LRU)
.setStatisticsEnabled(true)
.setTimeToLiveSeconds(-1));
}
}
Кешированный метод:
@Override
@Cacheable(value = "myCache", unless = "#result == null", key = "{#someString, #someLong, #someInteger}")
public List<MyReturnObject> methodWithCachedResults (String someString, Long someLong, Integer someInteger) {
//my logic
}
Пример вспомогательного метода:
public void evictKey(String aString, Long aLong, Integer anInteger) {
IMap<Object, Object> hazelcastCache = Hazelcast.getHazelcastInstanceByName("hazelcast-instance").getMap("myCache");
hazelcastCache.evict(Arrays.asList(aString, aLong, anInteger));
logger.info("{}", hazelcastCache.keySet());
}
Когда я запускаю описанный выше метод, он регистрирует ключ, даже если я принудительно выселил ключ.
Результат тот же, когда я пытаюсь использовать CacheManager:
@Autowired
private HazelcastCacheManager cacheManager;
public void evictKey(String aString, Long aLong, Integer anInteger) {
cacheManager.getCache("myCache").evict(Arrays.asList(aString, aLong, anInteger));
}
Однако, если я попробую это сделать, он очистит весь кеш, о чем, очевидно, говорится:
public void evictKey(String aString, Long aLong, Integer anInteger) {
IMap<Object, Object> hazelcastCache = Hazelcast.getHazelcastInstanceByName("hazelcast-instance").getMap("myCache");
hazelcastCache.clear();
}
Кстати, проверка keySet (). Contains (Arrays.asList ...) возвращает true.
@CacheEvict
, для удаления элементов из кеша, так как он воссоздает правильный ключ. - person M. Deinum   schedule 02.04.2020logger.info("{}", hazelcastCache.keySet());
какой тип возвращаемых ключей? Вы удаляете ключ списка, но если фактический ключ не является списком, он его не найдет. - person Neil Stevenson   schedule 03.04.2020delete
вместоevict
. Однако, как уже упоминалось, я настоятельно рекомендую использовать аннотацию или абстракцию кеша Spring для выселения вместо прямой попытки доступа к кешу. - person M. Deinum   schedule 03.04.2020