Guava команда участник здесь.
Выполнение проекта Guava Cache
заканчивается в ходе обычных операций технического обслуживания, которые происходят в каждом сегменте во время операций записи кеша, а иногда и во время операций чтения кеша. Записи обычно не заканчиваются на точно их срок годности, только потому, что Cache
делает намеренное решение не создавать собственный поток обслуживания, а позволяет пользователю решить, требуется ли непрерывное техническое обслуживание.
Я собираюсь сосредоточиться на expireAfterAccess
, но процедура для expireAfterWrite
почти идентична. С точки зрения механики, когда вы указываете expireAfterAccess
в CacheBuilder
, каждый сегмент кеша поддерживает очередь доступа к связанным спискам для записей в порядке наименее доступного доступа к самому последнему доступу. Элементы кэша фактически являются узлами в связанном списке, поэтому при доступе к записи он удаляется из своей старой позиции в очереди доступа и перемещается в конец очереди.
Когда выполняется обслуживание кеша, все кеширование должно состоять в том, чтобы истечь каждую запись в передней части очереди, пока не найдет неиспользуемую запись. Это просто и требует относительно небольших накладных расходов, и это происходит в ходе обычного обслуживания кеша. (Кроме того, кеш преднамеренно ограничивает объем работы, выполняемой в одной очистке, сводя к минимуму расходы на любую операцию с одним кешем.) Обычно расходы на обслуживание кеша преобладают за счет вычисления фактических записей в кеше.
+1 ... Большое спасибо за объяснение и большое спасибо за Гуаву. Связанный список «трюк» очень аккуратный! Я устанавливаю Guava сразу: благодаря вашему подробному ответу, теперь я продаюсь на Guava:) –
Чарльз Фрай отлично выступил с презентацией о MapMaker/CacheBuilder в Strange Loop. Разговор доступен [в InfoQ] (http://www.infoq.com/presentations/Concurrent-Caching-at-Google) –
будет использовать Datastructure, кроме LinkedList, каким-то образом поможет улучшить процесс выселения? – asgs