Кэш на основе карты с истечением и мягкими значениями - PullRequest
10 голосов
/ 27 июля 2011

Я пытаюсь кэшировать информацию на карте, чтобы мне не приходилось, например, нажимать на БД.В Java я бы использовал превосходную коллекцию Google MapMaker и установил срок действия, чтобы сохранить кэш как можно более свежим, и softValues, чтобы уменьшить использование памяти.Тогда у меня была бы функция, которая вычисляет значение для ключа, который в настоящее время не кэшируется.

MapMaker().softValues
          .expireAfterWrite(10, TimeUnit.MINUTES)
          .makeComputingMap(Function(...));

Какой лучший способ сделать это в Scala?

Ответы [ 3 ]

6 голосов
/ 27 июля 2011

Как сказала Ким, почему все по-другому, если MapMaker хорошо работает для вас?

import collection.JavaConverters._
val cache = /* your MapMaker code creating a Java map */.asScala

И теперь вы получаете доступ к базовой карте Java с помощью методов из карты Scala.

1 голос
/ 05 февраля 2013

Я создал функционально прозрачную карту срока действия в Scala.Добавление и удаление элементов дает новую карту, которая также удаляет все просроченные значения.

Карта истечения срока действия

0 голосов
/ 03 апреля 2017

Я также продолжаю использовать решение для кэширования Guava в Scala:)

Прежде всего, как отмечено в одном из комментариев, в более новых версиях Guava Cache , MapMaker() теперь устарела, и вы должны использовать CacheBuilder.

Так что теперь, в Scala это будет выглядеть следующим образом:

  lazy val cachedData = CacheBuilder.newBuilder()
    .expireAfterWrite(60, TimeUnit.MINUTES)
    .maximumSize(10)
    .build(
      new CacheLoader[Key, Data] {
        def load(key: Key): Data = {
          veryExpansiveDataCreation(key)
        }
      }
    )

Чтобы читать из него, вы можете использовать что-то вроде:

  def cachedData(ketToData: Key): Data = {
    try {
      return cachedData.get(ketToData)
    } catch {
      case ee: Exception => throw new YourSpecialException(ee.getMessage);
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...