我正在构建一个类似 Facebook 的新闻源。这意味着它是由许多 SQL 表构建的,并且每种数据类型都有特定的布局。但它的负载变得非常重,我希望让它变得更加复杂......
这就是我现在所做的:
用户模型:
def updates(more_options = {})
(games_around({},more_options) + friends_statuses({},more_options).sort! { |a,b| b.updated_at <=> a.updated_at }.slice(0,35) + friends_stats({:limit => 10},more_options) + friends_badges({:limit => 3},more_options)).sort! { |a,b| b.updated_at <=> a.updated_at }
end
徽章数据示例:
def friends_badges(options = {:limit => 3}, more_options = {})
rewards = []
rewards = Reward.find(:all, options.merge!(:conditions => ["rewards.user_id IN (?)",self.players_around({},more_options).collect{|p| p.id}], :joins => [:user, :badge], :order => "rewards.created_at DESC"))
rewards.flatten
end
新闻源视图:
<% for update in @current_user.updates %>
<% if update.class.name == "Status" %>
<% @status = update %>
<%= render :partial => "users/statuses/status_line", :locals => {:status => update} %>
<% elsif update.class.name == "Game" %>
<%= render :partial => "games/game_newsfeed_line", :locals => {:game => update} %>
<% elsif update.class.name == "Stat" %>
<%= render :partial => "stats/stat_newsfeed_line", :locals => {:stat => update} %>
<% elsif update.class.name == "Reward" %>
<%= render :partial => "badges/badge_newsfeed_line", :locals => {:reward => update} %>
<% end %>
<% end %>
我想到的选项:
- 构建“Feed”表并通过后台作业预处理每个用户的大部分更新。最有可能是每小时一次的 cron。我会存储每次更新的完整 HTML 代码。
- 保留初始结构,但单独缓存每个更新(现在我没有缓存)
- 切换到 MongoDB 以更快地访问数据库
我不得不说,我并不是真正的专家,Rails 使第一步变得简单,但现在每页加载超过 150 个 SQL 请求,我觉得它已经失控,需要专家的观点......
你会怎么办?
感谢您的宝贵帮助,