Cache 가 Ruby China 에서 의 응용 현황 분석
최근 24h 평균 응답 시간
데이터 가 많은 페이지(Action)
방 문 량 이 작 동 하 는 몇 가지 Action 의 상황:
TopicsController#show
UsersController\#show(비참 합 니 다.주로 GitHub API 요청 이 느 립 니 다)
PS:이 글 을 발표 하기 전에 제 가 조금 수정 을 했 습 니 다.GitHub 는 백 스테이지 대기 열 에 놓 아 달라 고 요 청 했 습 니 다.새로운 결 과 는 다음 과 같 습 니 다.
TopicsController#index
HomeController#index
위의 보고 서 를 보면 현재 Ruby China 백 엔 드 의 요청 은 사용자 홈 페이지 를 제외 하고 응답 시간 이 100 ms 이내 이 고 심지어 더 낮다.
우 리 는 어떻게 했 습 니까?
마크 다운 캐 시
Fragment Cache
데이터 캐 시
ETag
정적 자원 캐 시(JS,CSS,그림)
마크 다운 캐 시
내용 을 수정 할 때 Markdown 의 결 과 를 좋게 생각 하고 데이터베이스 에 저장 하여 탐색 할 때 반복 적 으로 계산 하지 않도록 합 니 다.
그 밖 에 이 물건 도 특별히 Cache 에 넣 지 않 고 데이터베이스 에 넣 었 습 니 다.
지속 화 를 위해 Memcached 가 멈 출 때 대량으로 잃 어 버 리 지 않도록 합 니 다.
캐 시 메모 리 를 너무 많이 사용 하지 않도록 합 니 다.
class Topic
field :body # ,
field :body_html # ,
before_save :markdown_body
def markdown_body
self.body_html = MarkdownTopicConverter.format(self.body) if self.body_changed?
end
end
Fragment Cache
이것 은 Ruby China 에서 가장 많이 사용 되 는 캐 시 방안 이자 속도 가 향상 되 는 원인 입 니 다.
app/views/topics/_topic.html.erb
<% cache([topic, suggest]) do %>
<div class="topic topic_line topic_<%= topic.id %>">
<%= link_to(topic.replies_count,"#{topic_path(topic)}#reply#{topic.replies_count}",
:class => "count state_false") %>
...
</div>
<% end %>
topic 의 cache 로key 는 캐 시 cache views/topics/{번호}-\#{업데이트 시간}/{suggest 매개 변수}/{파일 내용 MD5}->views/topics/19105-2014 508153844/false/bc 178 d556 ecae 49971 b0e3566f 12사용자 계 정 에 따라 서로 다른 상태 로 표 시 된 부분 과 관련 되 고 전체 HTML 을 직접 준비 하 며 JS 를 통 해 상 태 를 제어 합 니 다.예 를 들 어 현재 의'좋아 하 는'기능 등 입 니 다.
<script type="text/javascript">
var readed_topic_ids = <%= current_user.filter_readed_topics(@topics) %>;
for (var i = 0; i < readed_topic_ids.length; i++) {
topic_id = readed_topic_ids[i];
$(".topic_"+ topic_id + " .right_info .count").addClass("state_true");
}
</script>
예컨대
app/views/topics/_reply.html.erb
<% cache([reply,"raw:#{@show_raw}"]) do %>
<div class="reply">
<div class="pull-left face"><%= user_avatar_tag(reply.user, :normal) %></div>
<div class="infos">
<div class="info">
<span class="name">
<%= user_name_tag(reply.user) %>
</span>
<span class="opts">
<%= likeable_tag(reply, :cache => true) %>
<%= link_to("", edit_topic_reply_path(@topic,reply), :class => "edit icon small_edit", 'data-uid' => reply.user_id, :title => " ")%>
<%= link_to("", "#", 'data-floor' => floor, 'data-login' => reply.user_login,
:title => t("topics.reply_this_floor"), :class => "icon small_reply" )
%>
</span>
</div>
<div class="body">
<%= sanitize_reply reply.body_html %>
</div>
</div>
</div>
<% end %>
역시 reply 를 통 해 cachekey 캐 시 views/replies/202695-20140508081517/raw:false/d91dddbcb269f3e 0172 bf5d0d27e 9088또한 여기 에는 복잡 한 사용자 권한 제어 가 있어 JS 로 이 루어 집 니 다.
<script type="text/javascript">
$(document).ready(function(){
<% if admin? %>
$("#replies .reply a.edit").css('display','inline-block');
<% elsif current_user %>
$("#replies .reply a.edit[data-uid='<%= current_user.id %>']").css('display','inline-block');
<% end %>
<% if current_user && !@user_liked_reply_ids.blank? %>
Topics.checkRepliesLikeStatus([<%= @user_liked_reply_ids.join(",") %>]);
<% end %>
})
</script>
데이터 캐 시사실 Ruby China 의 대부분 Model 조 회 는 Cache 에 올 라 가지 않 았 습 니 다.실제 상황 을 보면 MongoDB 의 조회 응답 시간 이 빠 르 고 대부분 장면 이 5ms 이내 이 며 심지어 더 낮 기 때 문 입 니 다.
GitHub Repos 가 져 오기 와 같은 가격 대비 데이터 조회 캐 시 를 만 들 것 입 니 다.
def github_repos(user_id)
cache_key = "user:#{user_id}:github_repos"
items = Rails.cache.read(cache_key)
if items.blank?
items = real_fetch_from_github()
Rails.cache.write(cache_key, items, expires_in: 15.days)
end
return items
end
ETag
ETag 는 HTTP Request 에서 Response 가 가 져 올 수 있 는 매개 변수 로 내용 이 업데이트 되 었 는 지 확인 하여 네트워크 비용 을 줄 일 수 있 습 니 다.과정 은 대략 이렇다.
Rails 의 freshwhen 방법 은 검색 내용 을 ETag 정보 로 만 드 는 데 도움 을 줄 수 있 습 니 다.
def show
@topic = Topic.find(params[:id])
fresh_when(etag: [@topic])
end
정적 자원 캐 시이 물건 을 얕 보지 마 세 요.백 엔 드 가 아무리 빨리 써 도 느 려 질 수 있 습 니 다.(브 라 우 저 위의 표현)
1、Rails Assets Pipeline 을 합 리 적 으로 이용 하려 면 반드시 오픈 해 야 합 니 다!
# config/environments/production.rb
config.assets.digest = true
2.Nginx 에서 CSS,JS,Image 의 캐 시 유효기간 을 max 로 설정 합 니 다.
location ~ (/assets|/favicon.ico|/*.txt) {
access_log off;
expires max;
gzip_static on;
}
3.한 페이지 의 JS,CSS,Image 의 수량 을 최대한 줄 이 고 간단 한 방법 은 이 를 합병 하여 HTTP 요청 비용 을 줄 이 는 것 입 니 다.
<head>
...
<link href="//ruby-china-files.b0.upaiyun.com/assets/front-1a909fc4f255c12c1b613b3fe373e527.css" rel="stylesheet" />
<script src="//ruby-china-files.b0.upaiyun.com/assets/app-24d4280cc6fda926e73419c126c71206.js"></script>
...
</head>
약간의 팁통계 로 그 를 보고 데이터 가 높 은 페이지 를 우선 처리 합 니 다.
updated_at 는 캐 시 를 정리 하 는 데 매우 유리 한 물건 입 니 다.잘 사용 하 세 요!데 이 터 를 수정 할 때 무시 하지 마 세 요!
레일 스 로그 의 조회 시간 에 관심 을 가 져 라.100 ms 가 넘 는 페이지 응답 시간 은 비교적 좋 은 상태 이 고 200 ms 가 넘 는 사용 자 는 둔 감 함 을 느 낄 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【swift4】 image를 cache화한다Swift4에서 image를 cache화하는 정보가 좀처럼 발견되지 않았기 때문에, 기재해 가고 싶습니다. 만약 실수등이 있으면, 지적해 주시면 기쁩니다! 먼저 iOS에서는 NSCache 클래스를 사용하여 캐시를 수...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.