2016-04-19 15 views
0

Ich schreibe eine Rails 5 JSON API.Wie cache Top N Beiträge nach Bewertung sortiert?

Ich habe eine Aktion bekam die oben N Blog-Beiträge liefert basierend auf durchschnittliche Bewertung. Um eine niedrige Antwortzeit zu erreichen, denormalisierte ich meine Datenbank so, dass posts eine average_rating Spalte hat.

Ich bin auch Caching jede Abfrage wie folgt:

# posts_controller.rb 
def top 
    quantity = params[:quantity] 

    if quantity.to_i > 0 
    render json: { 
     posts: cached_top_posts(quantity) 
    }, status: :ok 
    else 
    render json: '', status: :unprocessable_entity 
    end 
end 

def cached_top_posts(quantity) 
    Rails.cache.fetch(['top', quantity], expires_in: 1.hour) do 
    Post.limit(quantity).as_json(only: [:title, :content, :average_rating]) 
    end 
end 

(Sortieren nach average_rating im Modell selbst)

Ich bin mir bewusst, dass dies bei weitem nicht optimal ist.

Während es drastisch Reaktionszeit verbessert, wenn die gleiche Menge Beiträge anfordert, wäre es viel besser, wenn, wenn es bereits oben gecached 1000 Beiträge, wird es nicht Cache 100 Beiträge, sondern würde sich zuerst 100 Beiträge aus der zwischengespeichert 1000.

Was ist ein guter Weg, dies zu erreichen?

Antwort

0

Nun, nachdem ich gut geschlafen hatte, kam mir eine einfache Schlussfolgerung in den Sinn.

Hier ist sie:

# posts_controller.rb 
def cached_top_posts(quantity) 
    data = Rails.cache.read('top_posts') 
    if data.nil? || data[:quantity] < quantity 
    data = { 
     :quantity => quantity, 
     :posts => Post.limit(quantity).as_json(only: [:title, :content, :average_rating]) 
    } 
    Rails.cache.write('top_posts', data, expires_in: 1.hour) 
    end 
    data[:posts][0...quantity] 
end