2016-04-19 2 views
0

Я пишу Rails 5 JSON API.Как кэшировать верхние N сообщений, упорядоченных по рейтингу?

У меня есть действие, которое возвращает топ N сообщения пользователя на основе среднего рейтинга. Чтобы достичь низкого времени отклика, я денормализовал свою базу данных таким образом, чтобы posts столбец average_rating.

Я также кэширование каждый запрос следующим образом:

# 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 

(Приказ average_rating в самой модели)

Я знаю, что это далеко от оптимального.

Хотя это значительно сокращает время отклика при запросе того же количества постов, было бы гораздо лучше, если бы, когда он уже кэшируются топ 1000 сообщений, это не будет кэш 100 сообщений, но вместо этого получит первый 100 сообщений из кэш 1000.

Что такое хороший способ достичь этого?

ответ

0

Ну, после того, как я хорошо выспался, простой вывод пришел мне в голову.

Здесь:

# 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 
Смежные вопросы