面试题答案
一键面试1. 页面缓存
- 原理:在Web服务器层面缓存整个页面,当相同请求再次到来时,直接返回缓存的页面,无需经过应用程序处理。
- 适用场景:适用于变化频率低,内容对所有用户基本一致的页面,如静态介绍页面等。在API场景下,不太常用,因为API通常需要根据用户身份、请求参数等返回不同数据。
- Rails实现示例:在Rails应用的
config/environments/production.rb
中配置:
config.action_controller.perform_caching = true
然后在控制器中:
class StaticPagesController < ApplicationController
caches_page :index
end
2. 片段缓存
- 原理:缓存页面中的部分片段,这些片段可以是动态生成的,但变化频率相对较低。
- 适用场景:适用于API中部分数据相对稳定的情况,比如获取用户列表接口中,某些固定的头部信息等。
- Rails实现示例:在视图中:
<% cache([:user_list, @user_list.maximum(:updated_at)]) do %>
<!-- 用户列表片段代码 -->
<% @user_list.each do |user| %>
<p><%= user.name %></p>
<% end %>
<% end %>
3. 动作缓存
- 原理:缓存整个控制器动作的响应结果,下次相同请求到达时,直接从缓存中取出响应,无需执行控制器动作中的代码逻辑。
- 适用场景:对于获取用户列表这类不依赖太多用户特定信息,且数据更新频率较低的API接口适用。例如,一个不需要鉴权的公开用户列表接口。
- Rails实现示例:在控制器中:
class UsersController < ApplicationController
caches_action :index, expires_in: 1.hour, if: Proc.new { request.format.json? }
def index
@users = User.all
render json: @users
end
end
4. 针对不同API接口选择合适的缓存策略
- 获取用户列表:
- 缓存策略:如果用户列表数据更新频率不高,并且对所有用户展示相同,可以使用动作缓存。如果列表中有部分固定内容和部分动态内容,可以结合片段缓存。
- 代码实现:如上述动作缓存示例。若使用片段缓存:
class UsersController < ApplicationController
def index
@users = User.all
render json: {
fixed_part: '固定头部信息',
user_list: cache([:user_list, @users.maximum(:updated_at)]) do
@users.map { |user| { name: user.name } }
end
}
end
end
- 获取单个用户详情:
- 缓存策略:可以考虑使用片段缓存,根据用户ID及用户最后更新时间作为缓存标识。因为单个用户详情数据相对独立,且可能更新频繁,全量缓存动作不太合适。
- 代码实现:在控制器中:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: cache([:user_detail, @user.id, @user.updated_at]) do
{ name: @user.name, email: @user.email }
end
end
end