Spring Cache Abstraction с Hazelcast не извлекает ключ из кэша - PullRequest
1 голос
/ 02 апреля 2020

При следующей конфигурации мой возвращаемый объект кэшируется, но когда я пытаюсь вручную удалить ключ, он не работает.

@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 
}

A пример вспомогательного метода:

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 (). Содержит (Arrays.asList ...) возвращает true.

1 Ответ

0 голосов
/ 03 апреля 2020

Это далеко не очевидно, но здесь есть две реализации List.

@Cacheable создаст экземпляр java.util.ArrayList.

Arrays.asList создаст экземпляр java.util.Arrays.ArrayList.

Это должно прояснить:

    public void evictKey(String aString, Long aLong, Integer anInteger) {
        IMap<Object, Object> hazelcastCache = Hazelcast.getHazelcastInstanceByName("hazelcast-instance").getMap("myCache");
        java.util.List<Object> keyToEvict = Arrays.asList(aString, aLong, anInteger);
        boolean success = hazelcastCache.evict(Arrays.asList(aString, aLong, anInteger));
        logger.info("Evicted {}, {} ==  {}", keyToEvict, keyToEvict.getClass(), success);
        for (Object key : hazelcastCache.keySet()) {
            logger.info("Remaining key {}, {}", key, key.getClass());
        }
   }
...