Недавно я попробовал кэш guava и был удивлен политикой выселения. Хотя кеш четко обозначен как lru в документах, но это не дефакто. Для меня выселения выглядят случайными, как показывает мой тест. (тест состоит в том, чтобы добавить 100 этнрис, получить 100 записей, пот 100 разных записей, проверить порядок выселения). Я не хотел бы обнаруживать некоторые неожиданные выселения во время выполнения. Не могли бы вы предоставить некоторые предпосылки политики выселения для ограниченного размера кеша. Как заставить ядро guava выселить, как LHM?Политика выселения кэша Guava
ответ
Ключи Guava: сегментированы в concurrencyLevel
различных хеш-таблицах, чтобы допускать множественные одновременные чтения и записи. По умолчанию concurrencyLevel
равно 4. В основном, если ваш maximumSize
установлен в 100
, то, что на самом деле только результаты в каждом из четырех сегментов становившихся maximumSize
из 25. Вот почему maximumSize
документации говорится:
Обратите внимание, что кеш может вытеснить запись до превышения этого предела. По мере того, как размер кеша увеличивается до максимума, кеш вытесняет записи, которые с меньшей вероятностью будут использоваться снова.
Так что, если случайно, было 30 записей, которые вошли в один конкретный сегмент, то 5 из этих записей будут выселены.
Единственный способ получить глобальное выселение с наименьшим доступом для Cache
- полностью отключить параллелизм, установив concurrencyLevel(1)
. Даже тогда документация не делает никаких гарантий на порядок выселения элементов, и вы не должны зависеть от него.
- 1. Предотвращение выхода из выселения из кэша Guava
- 2. Guava Caches: Отмена выселения определенных кешированных значений
- 3. Redis TTL vs "allkeys-lru" политика выселения
- 4. Ошибка переопределения кэша Guava
- 5. Возможности BiMap кэша Guava?
- 6. NSURLRequest политика кэша перечисление
- 7. политика кэша в php
- 8. Синхронизирован ли удаление кэша Guava?
- 9. Поведение и удержание кэша Guava
- 10. политика кэша в службе Parse.com
- 11. Guava Cache: Как получить доступ, не считая политики выселения?
- 12. Вероятностное раннее истечение с помощью кэша Guava
- 13. Построение кэша C# с байтом [] и политикой выселения
- 14. Политика локального HTML-кэша в UIWebView
- 15. ETags, IIS7, политика кэша ядра (enableKernelCache)
- 16. Политика истечения срока действия кэша .NET Ignite
- 17. EhCache: Выбор политики выселения
- 18. Обнаружение выселения сервисного работника
- 19. Java Guava Cache: Как очистить все записи кэша?
- 20. Redis: Сбой вместо выселения?
- 21. Hazelcast выселения и MapStore
- 22. Стратегия выселения Infinispan
- 23. Обновление асинхронного кэша с абстракцией весеннего кэша
- 24. База Java-решений для кэширования в памяти с политикой массовой загрузки и выселения
- 25. Google Guava Cache On App Engine
- 26. Политика конфиденциальности Политика конфиденциальности
- 27. guava - карта поддерживает функцию guava
- 28. Политика кэширования NSURLRequest
- 29. Кэш сеанса Bluemix: триггер для выселения кэшированных данных
- 30. Реализация кэша с использованием структуры кэша
Благодарим вас за ответ Louis. Для меня было непонятно, как относиться к этой документации. Итак, less concurrencyLevel = больше LRU. Но я все еще путаюсь с выселением на уровне сегмента. Я прав, если сегмент станет полным, скажем,> 25 (100/4) в моем случае, выселение начнется? или он будет выселен только в ~ maxSize, но вытеснит запись уровня lru на уровне сегмента? –
Если сегмент занимает более 25 записей, он вытеснит наименее недавно использованную запись _ в этом сегменте. –
(В принципе, каждый сегмент работает более или менее полностью независимо, поэтому их можно использовать одновременно, не блокируя друг друга.) –