APIを使用してサイドでシンプルなアプリケーションを構築していますが、SinatraでJSONを返すようにしました。かなりJSONですが、私のアプリのAPIは数百のリクエストを他のAPIに依存しています。Sinatraでレスポンスをキャッシュする最良の方法は?
おそらく結果を5日間キャッシュすることはできますが、データにはまったく問題はありません。私はキャッシングを実装する方法を100%確信していません。シナトラでそれをどうやってやるの?
APIを使用してサイドでシンプルなアプリケーションを構築していますが、SinatraでJSONを返すようにしました。かなりJSONですが、私のアプリのAPIは数百のリクエストを他のAPIに依存しています。Sinatraでレスポンスをキャッシュする最良の方法は?
おそらく結果を5日間キャッシュすることはできますが、データにはまったく問題はありません。私はキャッシングを実装する方法を100%確信していません。シナトラでそれをどうやってやるの?
個人的には、私はこのタイプのものに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
:memcachedの/のRedisに依存しないため
require 'redis'
redis = Redis.new
<make API calls here and build your JSON>
redis[id] = json
redis.expire(id, 3600*24*5)
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
をインストールする必要があります。
私は、このソリューションが好き –