`

Fragment Cache Part 1

阅读更多
之前介紹過 Page Cache,那是一個將所有動態內容都變成靜態頁面,藉由不經過 CGI ,來達到最大覆載度的技巧。但是他的應用性不夠廣泛,僅限於下面的用途


  1. 流量超級大的頁面
    通常是 index page,一個網站可能有幾百個頁面,但是通常 index page 一個頁面就佔了三到五成的流量,而且 index page 通常每個網站都是一個小時,了不起 15 分鐘更新一次,這個時候用 index page 可以大幅度增加網站覆載度。
  2. 頁面修改的頻率遠遠小於讀取的頻率
    例如 Blog 系統,我可能一天寫一篇文章,但是一天讀取我的 Blog 的人可能有幾千個,這個時候為什麼每次讀取頁面的時候都得去 DB 撈資料,組合,Render 出來呢?還不如用靜態頁面儲存,然後每次修改頁面時都重新產生新的 HTML 即可
但是,如果要利用 Page Cache 做到某些部份的功能實在有點麻煩。像是在同一個頁面裡面,有些地方是很少機會修改,希望能夠 Cache 起來,但是有些地方修改頻率超頻繁,不能夠用 Page Cache 來做。這個時候,我們就可以使用 Partial Cache 的方式來加快速度,在Rails 裡面 Partial Cache 叫做 Fragment Cache。

使用方式如下

在 View 裡面

選定要 Cache 的部份,將他用 cache block 包起來
<% cache do %>
我們要 cache 的 content
<% end %>
如此,當我們用 production mode 的時候,你就會發現會出現 tmp/cache/你的controller/你的action.cache 這個檔案,也就是 cache 的內容。並且 reload 的時候,那個 block 的 content 都是不變的。

理論上 cache 是 work 的,但是如果你去翻 log 時,你會發現 db 一樣會去做相關的 operation。原因是因為我們並沒有告訴 Rails ,Controller 裡面某段 code 是已經 cache 好的東西,不需要去執行。我們都知道 db 通常是最大的 bottleneck ,如果 cache 沒辦法避免 db operation,那這樣的 cache 也僅僅省去了 render 的時間,並沒有太多幫助。

在 Controller 裡面

為了避免這樣,我們要在 controller 裡面指明,當 Fragment Cache work 時,某些 operation 是可以不用執行的。
unless read_fragment :action => '這個action的名字'
跟 cache 有關的 operation
只要有 cache ,就不需要去執行的 code.....

end
如此如果已經 cache 過了, Rails 就會避開這段 code 的執行。

要如何 Expire Cache

Expire Cache 也是相當的方便,在 controller 裡面使用 expire_fragment 即可。
expire_fragment :action => '這個action的名字'
以上都是最最最基本的 Fragment Cache 的機制,但是如果只知道這些東西,根本做不了太多事情,我們下次來談談比較實用的 Fragment Cache 機制。
分享到:
评论

相关推荐

    fragment-cache, 重前端元素的部分和异步缓存的WordPress插件.zip

    fragment-cache, 重前端元素的部分和异步缓存的WordPress插件 fragment-缓存 fragment 缓存是一个用于部分和异步前端元素缓存的WordPress插件。 它目前支持缓存导航菜单。小部件和库。高速缓存构建在临时 API ( 。随...

    activity与fragment以及fragment与fragment之间的通信

    Fragment1通过调用Activity的方法,Activity再将消息传递给Fragment2。这种方式简单易懂,但增加了Activity的负担,可能导致Activity变得复杂。 2. **使用EventBus或RxBus**:EventBus是一种发布/订阅事件总线,...

    关于Fragment里面嵌套fragment

    1. **布局文件中声明嵌套Fragment**: 在父Fragment的布局XML文件中,可以像添加普通View那样添加子Fragment。使用`&lt;fragment&gt;`标签,并指定子Fragment的类名和ID。 ```xml &lt;fragment android:id="@+id/nested_...

    fragment之间交互1

    1. **基本通信方式**: - **findFragmentByTag() 或 getFragmentManager().findFragmentById()**:通过标签或ID获取另一个Fragment实例,然后直接调用其公共方法进行交互。 - **接口回调**:创建一个接口,让需要...

    Fragment内嵌套Fragment

    1. **Fragment的嵌套原理** - Fragment可以被添加到另一个Fragment中,形成嵌套结构。这在处理层次丰富的用户界面时非常有用,例如在TabLayout与ViewPager结合的场景下,每个Tab下的内容可以由一个主Fragment管理,...

    fragment中嵌套fragment

    1. **创建Fragment**:首先,你需要创建一个或多个子Fragment类,继承自`androidx.fragment.app.Fragment`。每个子Fragment都有自己的布局XML文件,定义了该Fragment的视图结构。 2. **在主Fragment中添加布局**:...

    graphql-ruby-fragment_cache:graphql-ruby插件,用于缓存部分响应

    GraphQL :: FragmentCache GraphQL::FragmentCache具有缓存响应片段的能力,可的能力:您可以将任何字段标记为已缓存,并且永远不会再次解析(至少在缓存有效时)。 例如,以下代码为每个帖子缓存title : class ...

    Fragment实现分页导航

    1. 当Fragment嵌套在另一个Fragment中时,需要处理好父Fragment与子Fragment的生命周期,避免因不当操作导致的异常。 2. 在使用ViewPager时,确保不要过度加载页面,以免影响性能。 3. 为了提高用户体验,可以在页面...

    fragment activity与fragment相互传值 fragment与fragment跳转

    1. **通过Intent**: 当Fragment作为Activity的一部分启动时,Activity可以通过Intent将数据传递给Fragment。然而,由于Fragment并不直接通过Intent启动,因此这种方式通常用于Activity启动另一个Activity时传递数据...

    ViewPager+Fragment,Fragment嵌套Fragment实现页面活动

    1. `ViewPager`基本使用: - 创建适配器:`ViewPager`需要一个实现了`PagerAdapter`接口的类来提供页面。通常我们会使用`FragmentPagerAdapter`或`FragmentStatePagerAdapter`,前者适用于页面数量较少且不需动态...

    多个fragment嵌套,返回上级fragment例子

    1. **Fragment的嵌套**: - 在Android中,一个Activity可以包含多个Fragment,而一个Fragment也可以包含其他Fragment,这就形成了Fragment的嵌套结构。 - 通常,我们通过在Fragment的布局文件中添加&lt;fragment&gt;标签...

    Fragment嵌套Fragment实现多tab页面

    1. **创建Fragment和子Fragment**:首先,你需要创建两个或更多个Fragment类,每个类代表一个选项卡的内容。然后,针对每个Fragment,你可能还需要创建对应的布局XML文件,定义其视图结构。 2. **设置ViewPager**:...

    fragment嵌套fragment

    1. **创建子Fragment**:首先,你需要创建要嵌套的Fragment类,并实现其逻辑和视图。 2. **在Parent Fragment中添加布局**:在Parent Fragment的布局XML文件中,添加一个可以容纳子Fragment的容器,通常是`...

    Android Fragment的使用-一个Fragment影响另外一个fragment。

    Android Fragment的使用。 功能:用一个Activity来管理两个Fragment,并且在其中一个Fragment中,点击按钮,影响到第二个Fragment。Activity中用list来管理Fragment。fragment布局采用垂直排列。

    Fragment回调接口

    1. `onAttach(Activity activity)`:当Fragment与其关联的Activity建立关联时调用,这时可以获取到Activity的引用,进行必要的初始化操作。 2. `onCreate(Bundle savedInstanceState)`:Fragment创建时调用,可以在...

    Android中在xml中静态添加Fragment

    1. **创建Fragment布局**:首先,我们需要为每个要添加的Fragment创建对应的XML布局文件,例如`fragment_left.xml`和`fragment_right.xml`。这些布局文件会定义Fragment的视图结构。 2. **在Activity布局中声明...

    fragment 与 activity 通信, fragment 与fragment通信

    fragment 与 fragment 通信 fragment 向 activity 传值 activity 向 fragment 传值 代码是自己手敲的

    点击切换Fragment并滑动切换Fragment

    在Android应用开发中,Fragment是UI组件的一种,它允许开发者在一个Activity中添加多个视图,增强了界面的灵活性和可交互性。"点击切换Fragment并滑动切换Fragment"的主题涉及到两个核心概念:用户交互触发的...

    Android在Fragment中实现监听触摸事件

    "Android在Fragment中实现监听触摸事件" Android在Fragment中实现监听触摸事件是指在Android应用程序中,如何在Fragment中监听触摸事件。Fragment是Android应用程序中的一个组件,它可以在Activity中使用,但是它并...

    TabFragment 使用Fragment 实现标签功能

    1. **Fragment**:`Fragment`是Android应用程序组件的一部分,可以独立于Activity存在,也可以在Activity内部进行嵌套。它有自己的生命周期和UI。在`TabFragment`中,每个标签通常会对应一个Fragment实例,显示不同...

Global site tag (gtag.js) - Google Analytics