В любом случае, чтобы просмотреть метаданные записи кэша из Hazelcast (например, дату добавления, последний доступ и т. д.)?

Я использую Hazelcast с распределенным кешем во встроенном режиме. Мой кеш определяется политикой выселения и политикой истечения срока действия.

CacheSimpleConfig cacheSimpleConfig = new CacheSimpleConfig()
        .setName(CACHE_NAME)
        .setKeyType(UserRolesCacheKey.class.getName())
        .setValueType((new String[0]).getClass().getName())
        .setStatisticsEnabled(false)
        .setManagementEnabled(false)
        .setReadThrough(true)
        .setWriteThrough(true)
        .setInMemoryFormat(InMemoryFormat.OBJECT)
        .setBackupCount(1)
        .setAsyncBackupCount(1)
        .setEvictionConfig(new EvictionConfig()
                .setEvictionPolicy(EvictionPolicy.LRU)
                .setSize(1000)
                .setMaximumSizePolicy(EvictionConfig.MaxSizePolicy.ENTRY_COUNT))
        .setExpiryPolicyFactoryConfig(
                new ExpiryPolicyFactoryConfig(
                        new TimedExpiryPolicyFactoryConfig(ACCESSED,
                                new DurationConfig(
                                        1800,
                                        TimeUnit.SECONDS))));

hazelcastInstance.getConfig().addCacheConfig(cacheSimpleConfig);

ICache<UserRolesCacheKey, String[]> userRolesCache = hazelcastInstance.getCacheManager().getCache(CACHE_NAME);
MutableCacheEntryListenerConfiguration<UserRolesCacheKey, String[]> listenerConfiguration =
        new MutableCacheEntryListenerConfiguration<>(
                new UserRolesCacheListenerFactory(), null, false, false);
userRolesCache.registerCacheEntryListener(listenerConfiguration);

Проблема, с которой я сталкиваюсь, заключается в том, что мой Listener, кажется, преждевременно срабатывает в производственной среде; прослушиватель выполняется (УДАЛЕН), даже если кеш был недавно запрошен.

Когда срабатывает прослушиватель срока действия, я получаю CacheEntry, но я хотел бы видеть причину истечения срока действия, независимо от того, было ли оно выселено (из-за политики MaxSize) или истекло (длительность). Если истек, я хотел бы увидеть отметку времени, когда к нему в последний раз обращались. Если выселено, я хотел бы видеть количество записей в кеше и т. д.

Доступны ли эти статистические данные/метрики/метаданные где-либо через API Hazelcast?


person Eric B.    schedule 13.08.2019    source источник
comment
Вы обращаетесь как минимум к 5 интересным темам с одним вопросом. Не могли бы вы разделить это, пожалуйста? Если вы хотите решить конкретную проблему с вашей конструкцией, сформулируйте проблему или, если вы хотите узнать специфику одного продукта и API, разделите вопросы на каждый продукт и конкретный элемент API.   -  person cruftex    schedule 13.08.2019
comment
Вы говорите о слушателях истечения срока действия JCache, но я не вижу никакого JCache. Подсказка: в жаргоне JCache истечение срока действия всегда означает прошедшее время.   -  person cruftex    schedule 13.08.2019
comment
@cruftex Вы правы - я думал, что использовал прослушиватели JCache, но, думаю, вместо этого я использовал прослушиватели ICache. Спасибо что подметил это. Я немного подчистил вопрос.   -  person Eric B.    schedule 13.08.2019


Ответы (1)


Статистика локального кэша (количество входов, количество исключений) доступна с помощью ICache#getLocalCacheStatistics(). Обратите внимание, что вам нужно setStatisticsEnabled(true) настроить кэш, чтобы статистика была доступна. Также обратите внимание, что возвращаемый объект CacheStatistics сообщает статистику только для локального члена.

При поиске информации об одной записи в кэше вы можете использовать функцию EntryProcessor, чтобы развернуть MutableEntry в класс com.hazelcast.cache.impl.CacheEntryProcessorEntry, специфичный для Hazelcast, и проверить его. Реализация Hazelcast обеспечивает доступ к CacheRecord, который предоставляет метаданные, такие как время создания/доступа.

Предостережение: специфичная для Hazelcast реализация может меняться между версиями. Вот пример:

cache.invoke(KEY, (EntryProcessor<String, String, Void>) (entry, arguments) -> {
            CacheEntryProcessorEntry hzEntry = entry.unwrap(CacheEntryProcessorEntry.class);
            // getRecord does not update the entry's access time
            System.out.println(hzEntry.getRecord().getLastAccessTime());
            return null;
        });
person Vassilis Bekiaris    schedule 13.08.2019
comment
Спасибо, но если я хочу вывести содержимое каждой записи в кэше, не зная ключей, как я могу перебрать его содержимое или получить список ключей, не обновляя время LastAccess? Это вообще осуществимо? Кажется, я не могу найти какие-либо методы в ICache или Cache, которые могли бы это сделать. - person Eric B.; 15.08.2019