2011-12-13 18 views
9

Tôi đang xây dựng một ứng dụng đơn giản ở bên cạnh bằng API mà tôi đã tạo bằng Sinatra trả về một số JSON. Có khá nhiều JSON, API của ứng dụng của tôi dựa trên một vài trăm yêu cầu đối với các API khác.Cách tốt nhất để lưu trữ một phản hồi trong Sinatra?

Tôi có thể lưu trữ kết quả trong 5 ngày hoặc lâu hơn, không có vấn đề gì với dữ liệu. Tôi chỉ không chắc chắn 100% làm thế nào để thực hiện bộ nhớ đệm. Tôi sẽ làm thế nào với Sinatra?

Trả lời

11

Cá nhân, tôi thích sử dụng redis cho loại điều này trên memcached. Tôi có một ứng dụng mà tôi sử dụng redis khá rộng rãi, sử dụng nó theo cách tương tự như những gì bạn mô tả. Nếu tôi thực hiện cuộc gọi không được lưu trong bộ nhớ cache, thời gian tải trang lên tới 5 giây, với redis, thời gian tải sẽ giảm xuống khoảng 0,3 giây. Bạn cũng có thể đặt thời gian hết hạn, có thể thay đổi khá dễ dàng. Tôi sẽ làm một cái gì đó như thế này để lấy dữ liệu từ bộ nhớ cache.

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

Sau đó, khi bạn muốn lưu dữ liệu vào bộ nhớ cache, có lẽ một cái gì đó như thế này:

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 

Đừng quên mkdir cache.

cách khác bạn có thể sử dụng memcache-client, nhưng nó sẽ yêu cầu bạn cài đặt memcached toàn hệ thống.

+3

Tôi thích giải pháp này vì không phụ thuộc vào memcached/redis –

Các vấn đề liên quan