Мне нужно кэшировать объекты в Java, используя пропорции любой доступной ОЗУ. Я знаю, что другие задали этот вопрос, но ни один из ответов не отвечает моим требованиям.Как эффективно кэшировать объекты в Java с помощью доступной оперативной памяти?
Мои требования:
- Простой и легкий
- Не значительно медленнее, чем простой HashMap
- Использование LRU, или некоторые удаления политики, которая аппроксимирует LRU
Я попытался LinkedHashMap, однако для этого требуется указать максимальное количество элементов, и я не знаю, сколько элементов потребуется для заполнения доступной ОЗУ (их размеры будут значительно различаться).
Мой текущий подход заключается в использовании Картограф Google коллекции следующим образом:
Map<String, Object> cache = new MapMaker().softKeys().makeMap();
Это казалось привлекательным, как она должна автоматически удалять элементы, когда это требуется больше оперативной памяти, однако существует серьезная проблема: его поведение для заполнения до полной доступной оперативной памяти, после чего GC начинает дрожать, а производительность всего приложения резко ухудшается.
Я слышал о таких вещах, как EHCache, но это кажется довольно тяжелым для того, что мне нужно, и я не уверен, достаточно ли он для моего приложения (помня, что решение не может быть значительно медленнее чем HashMap).
какие объекты вы кешируете? Я не совсем понимаю, почему вас беспокоит производительность кеша, учитывая, что, как только вы закончите политику истечения срока действия, вы получите больше накладных расходов, чем простая карта, а EHCache - хорошо развитая кэширующая библиотека, которая (I «Я думаю, что настроен через Spring здесь) не сложно настроить и просто прост в использовании, чем карта. – beny23
Объекты различаются по размеру от примерно 1 килобайта до 10 килобайт. Меня беспокоит производительность, поскольку извлечение объектов из кэша во внутреннем цикле очень интенсивного процесса. Если он медленный, он может увеличить время, требуемое для моего приложения, чтобы делать свою работу от нескольких часов до нескольких часов. – sanity
С помощью softKeys() вы не получите хита, если используете equals(), вы получите только удар, если будете искать объект с помощью ссылочного равенства. Если вам нужны equals() для хитов кеша, вместо этого используйте softValues (). –