1. 程式人生 > >JFinal框架學習-----cache的簡單使用

JFinal框架學習-----cache的簡單使用

一.關於快取

  Web快取是指一個Web資源(如html頁面,圖片,js,資料等)存在於Web伺服器和客戶端(瀏覽器)之間的副本。快取會根據進來的請求儲存輸出內容的副本;當下一個請求來到的時候,如果是相同的URL,快取會根據快取機制決定是直接使用副本響應訪問請求,還是向源伺服器再次傳送請求。比較常見的就是瀏覽器會快取訪問過網站的網頁,當再次訪問這個URL地址的時候,如果網頁沒有更新,就不會再次下載網頁,而是直接使用本地快取的網頁。只有當網站明確標識資源已經更新,瀏覽器才會再次下載網頁。因此很好的使用快取技術能夠大大提高效能。

二.快取的作用

  • 減少網路頻寬消耗(當Web快取副本被使用時,只會產生極小的網路流量,可以有效的降低運營成本)。
  • 降低伺服器壓力(給網路資源設定有效期之後,使用者可以重複使用本地的快取,減少對源伺服器的請求,間接降低伺服器的壓力。同時,搜尋引擎的爬蟲機器人也能根據過期機制降低爬取的頻率,也能有效降低伺服器的壓力)。
  • 減少網路延遲,加開頁面開啟速度。

三.JFinal中Cache快取的使用

  在JFinal中,預設的快取實現時使用EhCache。

1.Cache的相關配置:

    引入ehcache的jar包

 在src包下新建ehcache.xml檔案,裡面為ehcache的基本配置

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false" monitoring="autodetect"
         dynamicConfig="true">

    <!--指定一個檔案,當ehcache把資料寫到硬碟上時,會預設把資料寫到該檔案下-->
    <!--user.home - 使用者主目錄;user.dir - 使用者當前工作目錄;java.io.tmpdir - 預設臨時檔案路徑。-->
    <diskStore path="java.io.tmpdir" />

    <!-- 設定快取的預設資料過期策略 -->
    <defaultCache maxElementsInMemory="10000"
                  eternal="true"
                  timeToIdleSeconds="3600"
                  timeToLiveSeconds="3600"
                  overflowToDisk="true">
    </defaultCache>

    <!--自定義cache-->
    <cache  name="cacheText"
            maxElementsInMemory="10000"
            maxElementsOnDisk="1000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="900"
            timeToLiveSeconds="1800"
            memoryStoreEvictionPolicy="LFU">
    </cache>

</ehcache>

關於ehcache的配置引數的詳解:https://blog.csdn.net/huitoukest/article/details/80047935

2.Cache快取 

 (1) 在UserController.class中建立一個Action:

 public void text(){
        List<User> user = new User().dao().findByCache("cacheText","user1","select * from user");
        setAttr("user1",user).render("index.html");
    }

   findByCache方法引數:

  • cacheName為ehcache.xml中所設定的cache的name相同,即快取名稱。
  • key可以理解為資料物件的名字。
  • sql為sql語句

(2)檢視原始碼

    這樣執行出來你可能還是不理解Cache在其中究竟啟到了什麼樣的作用,下面我們來看看 findByCache的具體實現方式:

 public List<M> findByCache(String cacheName, Object key, String sql) {
        return this.findByCache(cacheName, key, sql, DbKit.NULL_PARA_ARRAY);
    }

    public M findFirstByCache(String cacheName, Object key, String sql, Object... paras) {
        ICache cache = this._getConfig().getCache();
        M result = (Model)cache.get(cacheName, key);
        if (result == null) {
            result = this.findFirst(sql, paras);
            cache.put(cacheName, key, result);
        }

        return result;
    }

    從具體實現程式碼中,我們可以看出,呼叫findByCache方法後,首先會通過getCache() 來獲得Cache的配置,然後根據傳入的引數從快取中查詢資料,如果查詢到的result結果為空,則通過sql語句在資料庫裡查詢,並將查詢的結果存入快取之中。反之,如果查詢的結果不為空,則直接返回result。

(3)關於具體實現,我們還可以通過打斷點,debug的方式來理解Cache的實現。

 

3.自定義快取:

    除了使用JFinal為我們提供的預設的ehcache快取之外,我們還可以通過實現ICache介面,重寫ICache中的方法來自定義快取。

package com.cache;

import com.jfinal.plugin.activerecord.cache.ICache;

public class idenCache implements ICache{
    @Override
    public <T> T get(String s, Object o) {
        return null;
    }

    @Override
    public void put(String s, Object o, Object o1) {

    }

    @Override
    public void remove(String s, Object o) {

    }

    @Override
    public void removeAll(String s) {

    }
}

使用自定義快取時,在基本配置類中的configPlugin()方法中,可以使用如下方式來對自定義快取以及預設快取進行切換。

 

   4.

除以上方法外,JFinal還提供了快取外掛可供使用。快取雖可以提高效率,但是當資料變換快時,則要謹慎使用。