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還提供了快取外掛可供使用。快取雖可以提高效率,但是當資料變換快時,則要謹慎使用。