生产缓存

时间:2017-11-18 12:53:01

标签: ruby-on-rails caching dalli

我目前正在测试我的应用中的缓存(Dalli gem)。并且发生了一件奇怪的事情。我正在缓存与current_user相关的列表。但是,当我使用不同的帐户(使用不同的浏览器)测试应用程序时,缓存是混合的。

例如:我运行一个更改User1缓存的操作,这些缓存应用于User2的帐户。

所以我想知道这个问题是否发生只是因为我在同一台计算机上进行开发,或者我是否应该改进我的缓存系统?

注意:我已跳过摘要以使其有效,我不确定他们的需求。所以我不确定这是否可以成为我问题的起点。

如果您想了解我正在做的事情的详细信息,我会分享我的代码。

我的代码:

用户(型号):

class User < ApplicationRecord
  has_many :users_group, dependent: :destroy
  has_many :groups, through: :users_group
  has_many :favorit_groups, dependent: :destroy
  has_many :fav_groups, through: :favorit_groups, class_name: "Group", source: :group

  def cached_favgroups
    Rails.cache.fetch([self, "fav_groups"]) {fav_groups.to_a}
  end

  def cached_groups
    Rails.cache.fetch([self, "groups"]) {groups.to_a}
  end

查看(sidenav):

<li class="list_groups_favorit">
<% cache 'cache_groups_fav_all', skip_digest: true do %>
  <% current_user.cached_favgroups.each do |group| %>
    <% cache group, skip_digest: true do %>
      <%= render 'groups/group', group: group%>
    <% end %>
  <% end %>
<% end %>
</li>
<li class="list_groups">
<% cache 'cache_groups_all', skip_digest: true do %>
  <% current_user.cached_groups.each do |group| %>
    <% cache group, skip_digest: true do %>
      <%= render 'groups/group', group: group%>
    <% end %>
  <% end %>
<% end %>
</li>

GroupController:

def favorit
  FavoritGroup.where(group_id: @group.id).where(user_id: current_user.id).first_or_create
  # Cache 
  Rails.cache.delete(current_user.cache_key+"/fav_groups")
  Rails.cache.delete(current_user.cache_key+"/groups")
  expire_fragment('cache_groups_fav_all')
  expire_fragment('cache_groups_all')
  expire_fragment(@group)
  # Cache
  respond_to do |format|
    format.html { redirect_back }
    format.js { render 'groups/js/favorit' }
  end 
end 

def unfavorit
  FavoritGroup.where(group_id: @group.id).where(user_id: current_user.id).delete_all
  # Cache
  Rails.cache.delete(current_user.cache_key+"/fav_groups")
  Rails.cache.delete(current_user.cache_key+"/groups")
  expire_fragment('cache_groups_fav_all')
  expire_fragment('cache_groups_all')
  expire_fragment(@group)
  # Cache
  respond_to do |format|
    format.html { redirect_back }
    format.js { render 'groups/js/unfavorit' }
  end
end 

0 个答案:

没有答案