2011-12-13 19 views
9

Estoy construyendo una aplicación simple en el lado usando una API que hice con Sinatra que devuelve algo de JSON. Es bastante JSON, la API de mi aplicación depende de unos cientos de solicitudes a otras API.¿La mejor manera de guardar una respuesta en Sinatra?

Probablemente pueda almacenar en caché los resultados durante 5 días más o menos, sin problemas con los datos en absoluto. Simplemente no estoy 100% seguro de cómo implementar el almacenamiento en caché. ¿Cómo podría hacer eso con Sinatra?

Respuesta

11

Personalmente, prefiero usar redis para este tipo de cosas en lugar de memcached. Tengo una aplicación que uso redis bastante extensamente, usándola de una manera similar a lo que describiste. Si realizo una llamada que no está en la memoria caché, el tiempo de carga de la página es de más de 5 segundos, con redis, el tiempo de carga se reduce a alrededor de 0.3 segundos. También puede establecer un tiempo de caducidad, que se puede cambiar con bastante facilidad. Haría algo como esto para recuperar los datos del caché.

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

A continuación, cuando se quería guardar los datos en la memoria caché, tal vez algo como esto:

require 'redis' 
redis = Redis.new 
<make API calls here and build your JSON> 
redis[id] = json 
redis.expire(id, 3600*24*5) 
11
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 

No olvides mkdir cache.

alternativamente puede usar memcache-client, pero le requerirá instalar memcached en todo el sistema.

+3

me gusta esta solución porque no depende de memcached/Redis –

Cuestiones relacionadas