хэш-карта Java кеша истекает ежедневно - PullRequest
6 голосов
/ 07 декабря 2011

Я хотел бы иметь HashMap<String, String>, чтобы каждый день в полночь срок действия кэша истекал.

Обратите внимание, что это решение J2EE, поэтому несколько потоков могут получить к нему доступ.

Как лучше всего реализовать это на Java?

Ответы [ 4 ]

6 голосов
/ 07 декабря 2011

Хотя другие предложения могут работать до истечения срока действия, важно отметить, что:

Истечение срока действия хеш-карты может быть выполнено лениво

т.е. без каких-либоконтролировать темы!

Таким образом, самый простой способ реализовать срок действия:

1) Расширить хеш-карту и создать локальную переменную nextMidtime (Long), инициализированный в System.currentTime .... в конструкторе.Это будет установлено равным следующему полуночному времени, в миллисекундах ...

2) Добавьте следующий фрагмент в первую строку методов containsKey и get (или любые другие методы, которые отвечают за то, чтобы данные не устарели) следующим образом:

if (currentTime> nextMidTime)
      this.clear();
      //Lets assume there is a getNextMidnight method which tells us the nearest midnight time after a given time stamp.  
      nextMidTime=getNextMidnight(System.currentTimeInMilliseconds);
4 голосов
/ 07 декабря 2011

Вы хотите, чтобы каждая вещь в хэш-карте была сброшена в полночь?

Если так, я думаю, я бы создал новую хэш-карту и заменил бы ее оригиналом.Поскольку подстановка выполняется за один шаг, и ничто другое не пытается сделать то же самое изменение, я считаю, что оно должно быть поточно-ориентированным.

Все, что находится в середине доступа, будет допущено для завершения доступа.Это предполагает, что ничто иное не содержит ссылку на эту хэш-карту.

Если ссылки на хэш-карту не объединены в одно место, то, я думаю, hashmap.clear() - ваша лучшая ставка, если хеш-карта синхронизирована.1009 * Если хэш-карта не синхронизирована, вы можете изменить ее только из одного потока, верно?Пусть этот поток вызовет hashmap.clear().

Я думаю, что он охватывает все случаи.

3 голосов
/ 07 декабря 2011

Вы также можете изучить использование CacheBuilder в Guava, которое позволяет создавать настраиваемый экземпляр их интерфейса Cache. Среди других полезных функций CacheBuilder позволяет вам установить истечение времени и т. Д. Для ваших собственных целей.

РЕДАКТИРОВАТЬ: Я должен отметить, что вы устанавливаете срок действия записей на основе последний доступ или последняя запись , так что это предложение не соответствует тому, что вы просишь именно то, что надо все промывать раз в ночь. Вы все еще можете изменить свой дизайн, если вы можете использовать сторонний API. Гуава очень умная библиотека ИМХО, и не только для кеширования.

2 голосов
/ 07 декабря 2011

java.util.Timer и java.util.TimerTask могут оказаться полезными.

Создайте TimerTask, который может очистить или заново создать HashMap и с помощью экземпляра Timer выполнить его в полночь.

Например:

// Public single shared hash map.
static Map<String, String> cached_map_ = new HashMap<String, String>();

public class Hash_map_resetter
    extends TimerTask
{
    // Constructor takes reference to containing
    // Timer so it can reset itself after execution.
    Hash_map_resetter(Timer a_timer) { timer_ = a_timer; }

    // Clear cache.
    public void run()
    {
        cached_map_ = new HashMap<String, String>();
        System.out.println("Cached cleared");
        timer_.schedule(new Hash_map_resetter(timer_), 100);
    }

    // Reference to containing Timer.
    private final Timer timer_;
}

// Example initiation.
Timer t = new Timer();
t.schedule(new Hash_map_resetter(t), 100);

Пример просто сбрасывает его каждые 100 миллисекунд. Существует множество Timer.schedule() методов, некоторые из них принимают Date и позволяют указывать полночь.

...