Redis модель кеширования, когда вызывать fetch_items в items_helper?

ruby-on-rails postgresql caching model redis

62 просмотра

2 ответа

1125 Репутация автора

Я пытаюсь использовать Redis как слой кеширования между моим приложением и базой данных PostgreSQL.

Пожалуйста, смотрите ниже мои маршруты, items_controller, items_helper файлы. Я запутался в том, как #fetch_items в items_helper должен вызываться.

В настоящее время я рендеринг шаблонов jbuilder из всех моих действий контроллера. Мне нужно сохранить эту функциональность.

маршруты

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
Автор: malexanders Источник Размещён: 17.07.2016 09:57

Ответы (2)


1 плюс

5258 Репутация автора

Решение

Вы должны вызывать fetch_itemsвручную, потому что этот метод не будет вызываться автоматически. Учитывая код, я полагаю, что вы можете заменить

@items = Item.all

с участием

@items = fetch_items

использовать fetch_itemsметод.

PS. fetch_itemsМетод не будет возвращать массив Itemобъектов, только массив хэшей, так что вам , возможно , потребуется настроить другие части кода , а также.

Я бы порекомендовал сравнительный анализ того, быстрее ли использовать Redis в этой конкретной ситуации, прежде чем приступить к работе.

Автор: lest Размещён: 17.07.2016 10:01

0 плюса

13289 Репутация автора

Я бы порекомендовал прочитать руководство по rails " кеширование с помощью rails ", прежде чем начинать использовать redis самостоятельно.

например, вы можете сделать что-то вроде:

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

Приведенный выше код будет хранить кэш всех элементов и обновляться до самого последнего обновления. Вероятно, не хотелось бы делать это, если ваша коллекция предметов огромна, но стоит задуматься.

Автор: Blair Anderson Размещён: 17.07.2016 11:15
Вопросы из категории :
32x32