Подтвердить что ты не робот

LRUCache в Scala?

Я знаю, что у Guava отличная библиотека кеширования, но я ищу что-то более Scala/функциональное, где я могу делать что-то вроде cache.getOrElse(query, { /* expensive operation */}). Я также посмотрел Scalaz Memo, но у этого нет истечения lru.

4b9b3361

Ответ 2

У людей спрей есть spray-caching модуль, который использует Futures. Существует простая версия LRU и версия, которая позволяет указать явное время для жизни, после чего записи истекли автоматически.

Использование фьючерсов, очевидно, позволяет вам писать код, который не блокируется. Что действительно круто, так это то, что он решает проблему "громовых стад" в качестве бонуса. Скажем, например, что сразу приходит куча запросов для той же записи, которая отсутствует в кеше. В наивной реализации кэша сто потоков могут пропустить эту запись в кеше, а затем убежать, чтобы генерировать одни и те же данные для этой записи в кеш, но, конечно же, 99% этого просто потрачено впустую. То, что вы действительно хотите, - это всего лишь один поток, чтобы сгенерировать данные и все 100 участников запроса, чтобы увидеть результат. Это происходит вполне естественно, если в вашем кеше есть Futures: первый запросчик немедленно устанавливает будущее в кеш, поэтому только первый запросчик пропускает. Все 100 получателей получают это Будущее для сгенерированного результата.