Лучший способ кешировать ответ в Синатре? - PullRequest
9 голосов
/ 13 декабря 2011

Я создаю простое приложение на стороне, используя API, который я сделал с Sinatra, который возвращает немного JSON. Это немного JSON, API моего приложения опирается на несколько сотен запросов к другим API.

Возможно, я могу кэшировать результаты в течение 5 дней или около того, никаких проблем с данными вообще. Я просто не уверен на 100%, как реализовать кэширование. Как бы я поступил так с Синатрой?

Ответы [ 2 ]

12 голосов
/ 13 декабря 2011

Лично я предпочитаю использовать redis для такого типа вещей, а не memcached.У меня есть приложение, в котором я довольно широко использую Redis, используя его так же, как вы описали.Если я выполняю вызов, который не кэшируется, время загрузки страницы превышает 5 секунд, а при повторном использовании время загрузки падает примерно до 0,3 секунды.Вы также можете установить время истечения, которое можно изменить довольно легко.Я бы сделал что-то подобное для извлечения данных из кеша.

require 'redis'
get '/my_data/:id' do
  redis = Redis.new
  if redis[params[:id]]
    send_file redis[params[:id]], :type => 'application/json'
  end
end

Затем, когда вы захотите сохранить данные в кеш, возможно, что-то вроде этого:

require 'redis'
redis = Redis.new
<make API calls here and build your JSON>
redis[id] = json
redis.expire(id, 3600*24*5)
12 голосов
/ 13 декабря 2011
get '/my_data/:id' do
  # security check for file-based caching
  raise "invalid id" if params[:id] =~ /[^a-z0-9]/i
  cache_file = File.join("cache",params[:id])
  if !File.exist?(cache_file) || (File.mtime(cache_file) < (Time.now - 3600*24*5))
    data = do_my_few_hundred_internal_requests(params[:id])
    File.open(cache_file,"w"){ |f| f << data }
  end
  send_file cache_file, :type => 'application/json'
end

Не забудьте mkdir cache.

в качестве альтернативы вы можете использовать memcache-client, но для этого потребуется установить memcached для всей системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...