Автообновление кеша с помощью Spray-кэширования

Я действительно новичок в scala и кэшировании спреев, и мне нужно знать, как это работает. У меня есть БД, и я хочу кэшировать некоторые таблицы и обновлять их каждый час, например. я не могу понять, как это реализовано в библиотеке спрей-кэширования. я думаю написать что-то похожее,

val cache: Cache[Double] = LruCache()
def cachedOp[T](key: T): Future[Double] = cache(key) {
//some big function which download table in json array
  getTableFromDb()
}

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


person mechanikos    schedule 08.09.2014    source источник


Ответы (1)


Вы можете использовать свойство timeToLive для настройки кеша, чтобы он не сохранял записи дольше 1 часа.

import scala.concurrent.duration._

val cache: Cache[Double] = LruCache(timeToLive = 1 hour)

Значение будет автоматически удалено из кеша через 1 час.

Это означает, что при следующем доступе к нему он не будет найден в кеше, поэтому он будет вычислен, а результат снова помещен в кеш еще на 1 час.

Вы обновляете свой кеш, используя его.

Я бы посоветовал вам также использовать свойство maxCapacity для управления размером вашего кеша, чтобы он не рос пропорционально.

Вы можете сделать что-то вроде:

val cache: Cache[Double] = LruCache(maxCapacity = 100, timeToLive = 1 hour)
def cachedOp[T](key: T): Future[Double] = cache(key) {
  getTableFromDb() // returns Future[Double]
}

Надеюсь, поможет.

см. документацию

person Arnaud Gourlay    schedule 08.09.2014
comment
Спасибо, но я не знаю, как это работает? что происходит через 1 час? кэш удалить данные или обновить их автоматически? Можете ли вы показать мне пример с рабочим кодом? - person mechanikos; 10.09.2014
comment
Я отредактировал свой ответ, скажите, отвечает ли он на ваши вопросы. - person Arnaud Gourlay; 10.09.2014
comment
спасибо, вы мне помогаете, но у меня есть несколько новых вопросов. это решение для таблицы выглядит как один объект (в паре ключ-значение? значение - таблица), я прав? если мне нужен кеш (который представляет собой хэш-карту) со всеми строками этой таблицы (пары key1-row1, key2-row2), что мне делать? тогда у меня много таблиц. У меня есть только одна идея о том, как это организовать - кэш с кэшами внутри (выглядят как key1-cachetable1,key2-cache-table2....), но это может быть плохая и глупая идея. можете рассказать об этом или дать какие-то советы и подсказки, если не возражаете? - person mechanikos; 11.09.2014
comment
Если вы хотите кэшировать только доступ к базе данных, создайте один кэш для каждой таблицы. Попытка кэшировать разные типы значений в одной и той же хэш-карте звучит как плохая идея ИМХО. - person Arnaud Gourlay; 11.09.2014
comment
Я действительно тупой, и я не могу автоматически обновлять кеш. например, я установил ttl = 5 секунд, и по истечении этого времени строка удаляется из кеша, а не коммутируется снова, просто удаляется ( - person mechanikos; 15.09.2014
comment
Он не обновляется автоматически при удалении, как я писал выше. Он просто вытесняет значение. Он вычисляется при следующей попытке доступа к нему. - person Arnaud Gourlay; 15.09.2014
comment
извините, если очень глупо или не понимаю вас. после 6 секунд сна потока я пытаюсь получить доступ к кешу - cache.get(key) и не получаю никакого значения. - person mechanikos; 15.09.2014
comment
не используйте cache.get(), так как он обращается только к кешу. Используйте функцию def cachedOp[T](key: T) для доступа к кешу при выполнении вычислений, если это необходимо. - person Arnaud Gourlay; 15.09.2014
comment
о... но при использовании функции .get это хорошо? может быть, я не понимаю истинного шаблона поведения для процесса кэширования... я вижу документацию и понимаю, что def apply(key: Any)(expr: => V): Future[V] возвращает значение моего кеша, если он существует, и def получает (ключ: Any): Option[Future[V]] также возвращает значение кеша - person mechanikos; 15.09.2014
comment
comment
Давайте продолжим обсуждение в чате. - person mechanikos; 15.09.2014