片段缓存和用户头像/图像

时间:2013-03-23 04:53:32

标签: ruby-on-rails ruby-on-rails-3 caching gravatar

我们在网站上使用Gravatar,但我们希望让用户直接上传他们的个人资料图片,以便改善与Stackexchange has been doing类似的用户体验。

在我们的网站上,用户可以互相关注,评论,“喜欢”,并以导致直接和间接生成内容的方式进行互动。 这意味着具有用户头像的缓存片段遍布整个地方,我们无法找到使其无效的合理方法,而不会对渲染性能产生负面影响。

以下是我们研究过的可能解决方案:

选项1)采用Gravatar方法并设置非常短的Expires/Cache-Control max-age标题并回收相同的图像文件名。

选项2)对所有用户使用占位符图片,其数据属性包含JavaScript读取的用户ID,并用于发出第二个Ajax请求,要求服务器提供最新数据化身。

有没有更好的方法来解决这个问题?我们忽视了什么吗?

1 个答案:

答案 0 :(得分:0)

我想我理解你的问题,但我不确定我将选项2理解为解决方案,这可能表明它不是一个很好的解决方案。如果是我,我只会将用户gravatar周围的html缓存在顶级缓存密钥中,该密码由用户ID加密。即。

<% cache("user_#{user.id}_profile_image") do %>
  <img src="blahblahblah or gravatar helper code or whatev">
<% end %>

如果你担心用户上传一个gravatar,然后有一个缓存的默认gravatar图像,我会说你最好的选择是:

1)在您发送它们以上传图钉的用户个人资料区域中,有一个刷新链接指向刷新操作,该操作实际上使该用户缓存片段无效。即。

expire_fragment "user_#{user.id}_profile_image"

http://guides.rubyonrails.org/caching_with_rails.html

2)你可以代替使用默认的gravatar重定向来上传图片,你可以拦截点击,将其发送到你自己的控制器,安排一个后台任务在15分钟左右运行,然后渲染一个javascript响应,将它们重定向到实际的gravatar页面以上传他们的pic。然后,后台工作程序将在以后运行时清除该片段。这假设他们实际上传了他们的图像,而且总的来说我会说一个可怕的想法。

老实说,我不确定你为什么担心开始使用gravatar。它击中了gravatars服务器,因此它不会对您的服务器造成负担,自己存储它似乎有点自我挫败到使用gravatar的程度。希望你的问题更简单(并且只是:当用户上传他们自己的图像时如何清除默认缓存的gravatar图像),这可以通过#1来解决,这将允许你使缓存的gravatar图像到期并使用你自己的方法重新缓存它用户上传图像后的图像。 (下次渲染页面会重新映射图像,因为你有一些逻辑:

<% cache("user_#{user.id}_profile_image") do %>
  <% if user.has_uploaded_image? %>
     <%= display_profile_image %>
  <% else %>
    <%= display_gravatar_image %>
  <% end %>
<% end %>