Я бы рекомендовал использовать MapMaker от Guava или CacheBuilder в r10.
Они допускают автоматическое * выселение по времени и размеру, а также поддерживают слабые ключи или значения. (Предстоящий CacheBuilder
обещает быть специально адаптирован к этому виду использования.)
Таким образом, вы можете инициализировать вашу карту:
ConcurrentMap<Key, Object> cache = new MapMaker()
.weakValues()
.makeMap();
И немедленная выгода будет в том, что когда значение будет собрано мусором, вся запись будет удалена. Кроме того, вы можете использовать компьютерную карту:
ConcurrentMap<Key, Object> cache = new MapMaker()
.weakValues()
.makeComputingMap(loadFunction);
где loadFunction
- это Function<Key, Object>
, который загружает объект из базы данных. Преимущество этого состоит в том, что карта будет обрабатывать параллельные запросы для определенного объекта, гарантируя, что запрос вызывается только один раз. Кроме того, запрашивающему коду нужен только вызов get()
, и он всегда может ожидать возврата объекта, будь то из кэша или базы данных.
В этих примерах используется MapMaker
- я еще не имел удовольствия играть с CacheBuilder
.
См. Мой вопрос Мой идеальный кеш, использующий guava , для большего количества примеров. В этом посте обсуждается, как объединить основанное на времени выселение с канонизацией.