Почему мой кеш guava постоянно перезаписывает элементы? - PullRequest
0 голосов
/ 01 февраля 2019

Привет всем работающим с кешем гуавы наткнулся на такую ​​проблему.Я пытаюсь реализовать хранилище в гуаве кеша CacheValue, в котором есть несколько полей.Я сделал кеш гуавы на основе LoadingCache, и я не могу понять, почему, когда я добавляю элементы size (), это всегда 1?

Мой метод ввода гуавы:

private LoadingCache<String, CacheValue> storage;
private static final Logger LOG = Logger.getLogger(GuavaCache.class);

@Override
public void put(String key, Object value) {
    storage.put(key, (CacheValue) value);
    storage = CacheBuilder.newBuilder()
            .expireAfterAccess(5, TimeUnit.SECONDS)
            .maximumSize(MAX_SIZE)
            .removalListener(notification -> LOG.info("Element was remove: " + notification.getKey()))
            .build(new CacheLoader<String, CacheValue>() {
                @Override
                public CacheValue load(String key) {
                    return (CacheValue) value;
                }
            });
}

Мой основной класс:

   AbstractCustomCache gg = new GuavaCache();


    for (int i = 0; i < 102; i++) {
        gg.put("ab" + i, new CacheValue("ab" + i, System.currentTimeMillis(), 0));
    }

    gg.get("ab4");
    gg.get("ab2");
    gg.get("ab0");

Мой вывод:

CacheValue{value=ab0, creationDate=1549027075333, frequency=0}  Size=  1
CacheValue{value=ab1, creationDate=1549027075333, frequency=0}  Size=  1
CacheValue{value=ab2, creationDate=1549027075333, frequency=0}  Size=  1
CacheValue{value=ab3, creationDate=1549027075334, frequency=0}  Size=  1
CacheValue{value=ab4, creationDate=1549027075334, frequency=0}  Size=  1
CacheValue{value=ab5, creationDate=1549027075334, frequency=0}  Size=  1
CacheValue{value=ab6, creationDate=1549027075334, frequency=0}  Size=  1
CacheValue{value=ab7, creationDate=1549027075334, frequency=0}  Size=  1
CacheValue{value=ab8, creationDate=1549027075334, frequency=0}  Size=  1
CacheValue{value=ab9, creationDate=1549027075334, frequency=0}  Size=  1

AbstractCustomCache:

public abstract class AbstractCustomCache implements CustomCache {
    static final int MAX_SIZE = 8;
    private Map<String, CacheValue> storage = new ConcurrentHashMap<>();

    public Map<String, CacheValue> getStorage() {
        return storage;
    }

В чем проблема?Как это можно исправить?

1 Ответ

0 голосов
/ 01 февраля 2019

Вы создаете storage = CacheBuilder.newBuilder() каждый раз с запросом пут. Вы должны создать его один раз.

storage = CacheBuilder.newBuilder()
            .expireAfterAccess(5, TimeUnit.SECONDS)
            .maximumSize(MAX_SIZE)
            .removalListener(notification -> LOG.info("Element was remove: " + notification.getKey()))
            .build(new CacheLoader<String, CacheValue>() {
                @Override
                public CacheValue load(String key) {
                    return (CacheValue) value;
                }
            });

Выше должен быть вызван один раз при инициализации кэша.Таким образом, на самом деле происходит то, что при каждом запросе пут вы создаете новое хранилище и добавляете к нему «cacheValue». Поэтому в любой момент времени максимальное количество записей равно 1.

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