2016-07-17 9 views
0

Ich versuche, redis als Caching-Layer zwischen meiner App und einer postgresql db zu verwenden. Ich habe das vorher noch nie gemacht, also bitte bare mit mir.Rails 4, Redis-Modell-Caching, wann rufen Sie fetch_items in items_helper auf?

Siehe unten, meine Routen, items_controller, items_helper Dateien. Ich bin verwirrt darüber, wie # fetch_items im items_helper aufgerufen werden soll.

Derzeit rendere ich Jbuilder-Vorlagen von allen meinen Controller-Aktionen. Ich muss diese Funktionalität behalten.

Routen

Rails.application.routes.draw do 
    resources :users 
    resources :items 
    get 'users/:id/sold_items' => 'users#sold_items' 
    get 'categories/:id/available_items' => 'categories#available_items' 

    get 'performances/:view' => 'performances#show' 

items_controller.rb

class ItemsController < ApplicationController 
    include ItemsHelper 
    # Returns full list of items 
    def index 
    @items = Item.all 
    end 

    # Returns details for a single item 
    def show 
    @item = Item.find(params[:id]) 
    end 
end 

items_helper

module ItemsHelper 

    def fetch_items 
     byebug 
     items = $redis.get("items") 
     if items.nil? 
      items = Item.all.to_json 
      $redis.set("items", items) 
     end 
     @items = JSON.load items 
    end 

end 

Antwort

1

Sie müssen fetch_items manuell aufrufen, da diese Methode nicht automatisch aufgerufen werden soll. In Anbetracht der Code, den ich nehme an, dass Sie

@items = Item.all 

mit

@items = fetch_items 

zu verwenden, um die fetch_items Verfahren ersetzen kann.

PS. Die fetch_items Methode wird kein Array von Item Objekten zurückgeben, sondern nur ein Array von Hashes, so dass Sie möglicherweise auch andere Teile des Codes anpassen müssen.

Ich würde Benchmarks empfehlen, ob die Verwendung von Redis in dieser speziellen Situation schneller ist, bevor es in die Produktion geht.

+0

großartige Idee, ich werde das versuchen – matthewalexander

0

Ich würde empfehlen, die Schienen Anleitung "caching with rails" vor der Verwendung von redis selbst zu lesen.

zum Beispiel könnten Sie so etwas wie:

cachekey = "items/#{Item.maximum(:updated_at)}" 
@items = Rails.cache.fetch(cachekey, expires_in: 12.hours) do 
    Item.all.as_json 
end 

Der obige Code einen Cache aller Elemente halten würde und auf das neueste Update aktualisiert bleiben. Wahrscheinlich würde dies nicht tun wollen, wenn Ihre Artikel-Sammlung riesig ist, aber eine Überlegung wert ist.