Элегантная реализация системы кэширования, использующей только Google Guava, которая позволяет кэшировать нулевые значения с истечением, отличным от ненулевых? - PullRequest
0 голосов
/ 07 ноября 2019

Вот мои настройки:


    private final LoadingCache<String, Optional<SampleInfo>> infoCache;
    private final LoadingCache<String, Optional<SampleInfo>> nullInfoCache;

        this.infoCache = CacheBuilder.newBuilder()
                .expireAfterWrite(CACHE_EXPIRY_HOURS, TimeUnit.HOURS)
                .build(new CacheLoader<String, Optional<SampleInfo>>() {

                    @Override
                    public Optional<SampleInfo> load(final String key) throws Exception {
                        return service.api(key);
                    }
                });

        this.nullInfoCache = CacheBuilder.newBuilder()
                .expireAfterWrite(NULL_CACHE_EXPIRY_SECONDS, TimeUnit.SECONDS)
                .build(new CacheLoader<String, Optional<SampleInfo>>() {

                    @Override
                    public Optional<SampleInfo> load(String key) throws Exception {
                        return service.api(key);
                    }
                });

И вот как я надеюсь использовать два кэша в тандеме:

           optSampleInfo = nullInfoCache.getIfPresent(sampleId);
            if (optSampleInfo == null || !optSampleInfo.isPresent()) {
                optSampleInfo = infoCache.get(sampleId);
                if (!optSampleInfo.isPresent()) {
                    nullInfoCache.put(sampleId, optSampleInfo);
                    infoCache.invalidate(sampleId);
                }
            }

Это не очень элегантно. Как мне сделать это лучше? Я не хочу использовать какие-либо специальные библиотеки кэширования. Я также не могу позволить себе вообще не кэшировать нули. Они просто должны быть кэшированы на гораздо более короткий период.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...