2012-04-19 3 views
7

Недавно я попробовал кэш guava и был удивлен политикой выселения. Хотя кеш четко обозначен как lru в документах, но это не дефакто. Для меня выселения выглядят случайными, как показывает мой тест. (тест состоит в том, чтобы добавить 100 этнрис, получить 100 записей, пот 100 разных записей, проверить порядок выселения). Я не хотел бы обнаруживать некоторые неожиданные выселения во время выполнения. Не могли бы вы предоставить некоторые предпосылки политики выселения для ограниченного размера кеша. Как заставить ядро ​​guava выселить, как LHM?Политика выселения кэша Guava

ответ

18

Ключи Guava: сегментированы в concurrencyLevel различных хеш-таблицах, чтобы допускать множественные одновременные чтения и записи. По умолчанию concurrencyLevel равно 4. В основном, если ваш maximumSize установлен в 100, то, что на самом деле только результаты в каждом из четырех сегментов становившихся maximumSize из 25. Вот почему maximumSize документации говорится:

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

Так что, если случайно, было 30 записей, которые вошли в один конкретный сегмент, то 5 из этих записей будут выселены.

Единственный способ получить глобальное выселение с наименьшим доступом для Cache - полностью отключить параллелизм, установив concurrencyLevel(1). Даже тогда документация не делает никаких гарантий на порядок выселения элементов, и вы не должны зависеть от него.

+0

Благодарим вас за ответ Louis. Для меня было непонятно, как относиться к этой документации. Итак, less concurrencyLevel = больше LRU. Но я все еще путаюсь с выселением на уровне сегмента. Я прав, если сегмент станет полным, скажем,> 25 (100/4) в моем случае, выселение начнется? или он будет выселен только в ~ maxSize, но вытеснит запись уровня lru на уровне сегмента? –

+0

Если сегмент занимает более 25 записей, он вытеснит наименее недавно использованную запись _ в этом сегменте. –

+0

(В принципе, каждый сегмент работает более или менее полностью независимо, поэтому их можно использовать одновременно, не блокируя друг друга.) –

Смежные вопросы