亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用緩存構(gòu)建更快的 Web 應用程序

系統(tǒng) 1688 0
使用 Java? 技術(shù)的 Web 開發(fā)人員可以使用緩存實用程序快速提升他們的應用程序的性能。Java 緩存系統(tǒng)(Java Caching System,JCS)是一個用于 Java 應用程序的強大分布式緩存系統(tǒng),它是擁有簡單 API 的高度可配置的工具。本文將概述 JCS 并展示如何使用它來提高 Web 應用程序的速度。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

許多 Web 應用程序會根據(jù)桌面應用程序重新編寫;理想情況下,這些應用程序的速度和可伸縮性應該與桌面版本一樣。幾乎所有 Web 應用程序都可以從速度方面的增長獲益。緩存被頻繁查看但很少更改的數(shù)據(jù)是一種減少用戶等待時間的有效方式。一個實用程序可以幫您實現(xiàn)這個目標,它使用簡單 易用的 API 來輕松處理數(shù)據(jù)緩存。開放源碼 JCS(即一個 Apache Jakarta 項目)就是這樣一種工具。本文將說明如何配置和使用 JCS 來緩存 Web 應用程序的數(shù)據(jù)。

JCS 概述

JCS 是一個用 Java 語言編寫的緩存系統(tǒng),可以使用它來創(chuàng)建 Java 桌面和 Web 應用程序。它提供了在緩存器中存儲數(shù)據(jù)、從緩存器中刪除數(shù)據(jù)等方便機制。

使用 JCS 可以在各種指定的數(shù)據(jù) 區(qū)域 中存儲緩存數(shù)據(jù)。JCS 定義了 4 種類型的核心區(qū)域:內(nèi)存區(qū)域、磁盤區(qū)域、外圍區(qū)域和遠程區(qū)域。可以結(jié)合使用這些核心區(qū)域以在如何存儲緩存數(shù)據(jù)、將緩存數(shù)據(jù)存儲在什么地方等方面獲得更大的靈活性。您可以指定首次使用哪個區(qū)域,以及發(fā)生故障時轉(zhuǎn)移到哪個區(qū)域。

內(nèi)存區(qū)域

內(nèi)存區(qū)域是一個使用最近最少算法(Least Recently Used,LRU)的純內(nèi)存緩存區(qū)域。當內(nèi)存緩存區(qū)域滿時,LRU 會首先刪除最近最少使用的緩存數(shù)據(jù)。這個數(shù)據(jù)區(qū)域執(zhí)行良好,大多數(shù) JCS 用戶將它指定為最先使用的默認緩存區(qū)域。

JCS 的可插入控制器
JCS 通過組合緩存器(Composite Cache)讓使用多個區(qū)域進行緩存存儲變得很簡單。組合緩存器為緩存區(qū)域提供了一個可插入控制器。組合緩存器仔細處理復雜的任務,即確定何時以及如何使 用每個緩存區(qū)域。JCS 將完成大部分復雜的工作,開發(fā)人員只需關(guān)心獲取和設置緩存。

磁盤區(qū)域

磁盤區(qū)域是在 Web 服務器的文件磁盤上緩存數(shù)據(jù)。為了提高性能,JCS 在文件磁盤上存儲實際緩存數(shù)據(jù)的同時,會在內(nèi)存中存儲緩存數(shù)據(jù)鍵。在首先使用內(nèi)存區(qū)域的典型 JCS 配置中,任何無法在內(nèi)存區(qū)域中保存的數(shù)據(jù)都會寫入磁盤區(qū)域中。

外圍區(qū)域

外圍區(qū)域提供一種可配置方式來在多臺服務器之間分發(fā)緩存數(shù)據(jù)。緩存數(shù)據(jù)服務器必須有一個開放的用于偵聽的端口,而且必須創(chuàng)建一個套接字連接。這個區(qū)域存在一個潛在問題,因為它不能保證各緩存之間的數(shù)據(jù)的一致性。但如果是按計劃使用該區(qū)域,則不會出現(xiàn)這個問題。

遠程區(qū)域

遠 程區(qū)域提供了一個使用遠程方法調(diào)用(RMI)API 的緩存區(qū)域。這個區(qū)域使用一臺遠程服務器處理緩存數(shù)據(jù)。這臺遠程緩存服務器可以被多個 JCS 客戶端應用程序用于存儲緩存數(shù)據(jù)。一些偵聽器被定義用于收集來自客戶端和服務器的請求。這個緩存區(qū)域幫助減少串行化和多個連接點的開銷。





JCS 配置

配置 JCS 就是簡單地創(chuàng)建和填充一個 cache.ccf 文件。這個文件定義緩存應該使用哪些區(qū)域,以及這些區(qū)域的屬性或選項。根據(jù)應用程序的需求配置這個文件是一種快速擴展緩存的簡便方式。您可以指定許多適合配置的選項和屬性來滿足需求。

清單 1 顯示的是最基本的 cache.ccf 文件 — 一個純內(nèi)存緩存配置:


清單 1. JCS 的基本配置
            
jcs.default=jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=1000
jcs.default.cacheattributes.MemoryCacheName=
org.apache.jcs.engine.memory.lru.LRUMemoryCache

從清單 1 中可以看出,該配置文件將內(nèi)存緩存指定為一個 LRUMemoryCache 。還可以看到,內(nèi)存中能保存的對象的最大數(shù)量被設置為 1000

大多數(shù)應用程序的緩存系統(tǒng)配置要比清單 1 中復雜得多。在清單 2 的配置中,我在定義自己的區(qū)域( OUR_REGION )時使用了一個內(nèi)存區(qū)域和一個磁盤區(qū)域:


清單 2. 在 JCS 配置中定義的區(qū)域
            
jcs.default=DISK_REGION
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=1000
jcs.default.cacheattributes.MemoryCacheName=
org.apache.jcs.engine.memory.lru.LRUMemoryCache

jcs.region.OUR_REGION=DISK_REGION
jcs.region.OUR_REGION.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.region.OUR_REGION.cacheattributes.MaxObjects=1000
jcs.region.OUR_REGION.cacheattributes.MemoryCacheName=
org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.region.OUR_REGION.cacheattributes.UseMemoryShrinker=true
jcs.region.OUR_REGION.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.region.OUR_REGION.cacheattributes.ShrinkerIntervalSeconds=60
jcs.region.OUR_REGION.cacheattributes.MaxSpoolPerRun=500
jcs.region.OUR_REGION.elementattributes=org.apache.jcs.engine.ElementAttributes
jcs.region.OUR_REGION.elementattributes.IsEternal=false

jcs.auxiliary.DISK_REGION=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DISK_REGION.attributes=
org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DISK_REGION.attributes.DiskPath=c:/jcs/disk_region
jcs.auxiliary.DISK_REGION.attributes.maxKeySize=100000

JCS 輔助插件
除了 4 個核心緩存實現(xiàn)外,JCS 還提供了一些 輔助插件 , 它們是區(qū)域可以使用的可選插件。這些輔助插件包括索引磁盤緩存(Indexed Disk Cache)、TCP 外圍緩存(TCP Lateral Cache)和遠程緩存服務器(Remote Cache Server)。例如,索引磁盤緩存允許在到達內(nèi)存閾值時在磁盤上交換項目。這使得每個區(qū)域能更靈活地控制其緩存,提供一種類似于大多數(shù)操作系統(tǒng)所使用的 虛擬內(nèi)存的存儲方法。cache.ccf 配置文件可以讓每個輔助區(qū)域滿足應用程序的需求。

清單 2 中的第一行表明該配置將默認區(qū)域設置為 DISK_REGION DISK_REGION IndexedDiskCacheFactory 類型,并且該文件在磁盤上指定為 c:/jcs/disk_region。清單 2 中的第二個配置組定義了我自己的區(qū)域,我為它添加了一些選項,這種類型的配置(在指定用戶定義區(qū)域時同時使用內(nèi)存區(qū)域和磁盤區(qū)域)是很常見的。清單 2 中的第 3 個配置組定義了一個 輔助區(qū)域

JCS 有兩個依賴項: concurrent commons-logging (JCS 1.2.7.0 之前的版本中,還有兩個其他依賴項: commons-collections commons-lang )。




JCS 的基本用法

學習 JCS 基礎知識的一個好方法是查看 API 最常用的方法。最好從初始化區(qū)域開始。初始化 JCS 緩存區(qū)域?qū)ο竽苁鼓L問大部分所需的常用方法。清單 3 初始化 JCS 對象并獲得一個默認緩存區(qū)域?qū)嵗?


清單 3. 檢索默認緩存區(qū)域
            
// Initialize the JCS object and get an instance of the default cache region
JCS cache = JCS.getInstance("default");

檢索 JCS 實例后,可以調(diào)用最需要的方法。 put 方法將一個新對象放入緩存中。接下來只需一個 key (第一個參數(shù))和一個 value (第二個參數(shù))。清單 4 顯示一個基本示例:


清單 4. 設置緩存項
            
// Set up
String key = "key0";
String value = "value0";

// Place a new object in the cache
cache.put(key, value);

清單 4 中的示例使用字符串值作為參數(shù),但是您可以使用任何對象。

檢索緩存對象只不過是使用 JCS 提供的 get 方法。清單 5 顯示了一個簡單示例。同樣,本例使用了一個字符串參數(shù),但您可以使用任何對象。


清單 5. 檢索緩存項
            
// Retrieve a cached object
String cachedData = (String)cache.get(key);

測試緩存數(shù)據(jù)的有效性可能是處理緩存系統(tǒng)時需要使用的另一種方法。在 JCS 中,沒有定義只測試緩存項是否存在的測試緩存方法。但是 get 方法的返回值可以幫助您。清單 6 顯示了一種獲得此必要功能的方式:


清單 6. 測試緩存項的有效性
            
// Retrieve a cached object
String cachedData = (String)cache.get(key);

// Check if the retrieval worked
if (cachedData != null) {
// The cachedData is valid and can be used
System.out.println("Valid cached Data: " + cachedData);
}

最后需要幾個用于在使用 JCS、緩存項和緩存區(qū)域后清除它們的常用緩存實用程序。JCS 提供了一種 clear 方法,用于從調(diào)用的緩存區(qū)域中刪除所有緩存數(shù)據(jù)。此外,還提供了一個 remove 方法,用于刪除指定緩存項。 dispose 方法也可以處理初始化的 JCS 區(qū)域。清單 7 顯示了如何使用這些方法:


清單 7. 清除緩存區(qū)域
            
// Dispose of a specific cached item
cache.remove(key);

// Dispose of all cache data
cache.clear();

// Dispose of the cache region
cache.dispose();





JCS 和 Java 對象

JCS 優(yōu)于其他緩存系統(tǒng)(請參閱 參考資料 )的一個地方是它可以很好地使用對象。大多數(shù) Web 應用程序是使用面向?qū)ο蟮姆椒ㄍㄟ^ Java 技術(shù)創(chuàng)建的。例如,與連續(xù)從數(shù)據(jù)庫中逐段檢索對象相比,緩存對象使應用程序能夠更好地執(zhí)行。

設計一個簡單的面向?qū)ο蟮?JCS 站點的第一個步驟是創(chuàng)建需要存儲的對象。在本例中,我將開發(fā)一個基本 blogging 站點。清單 8 顯示了我將使用的 BlogObject 類:


清單 8. BlogObject
            
package com.ibm.developerWorks.objects;

import java.io.Serializable;
import java.util.Date;

public class BlogObject implements Serializable {
private static final long serialVersionUID = 6392376146163510046L;
private int blogId;
private String author;
private Date date;
private String title;
private String content;

public BlogObject(int blogId, String author, Date date, String title, String content) {
this.blogId = blogId;
this.author = author;
this.date = date;
this.title = title;
this.content = content;
}

public int getBlogId() {
return this.blogId;
}

public String getAuthor() {
return this.author;
}

public Date getDate() {
return this.date;
}

public String getTitle() {
return this.title;
}

public String getContent() {
return this.content;
}
}

在一個類中表示對象后,接著還需要一個類來管理該對象。管理器處理所有與 blog 對象相關(guān)的管理和緩存功能。在本例中,管理器將處理三大任務:

  • 檢索 blog 對象
  • 在緩存中設置 blog 對象
  • 從緩存中清除 blog 對象

如清單 9 所示, getBlog 方法檢索 blog 對象。該方法首先試圖從緩存獲得 blog 對象。如果該對象不在緩存中,它將根據(jù)其他機制獲取該對象:


清單 9. 通過 blog 管理器檢索 blog 對象
            
public BlogObject getBlog(int id) {
BlogObject blog = null;

try {
blogCache = JCS.getInstance(blogCacheRegion);
blog = (BlogObject)blogCache.get(id);
} catch (CacheException ce) {
blog = null;
}

if (blog == null) {
blog = DatabaseManager.getBlog(id);
this.setBlog(
blog.getBlogId(),
blog.getAuthor(),
blog.getDate(),
blog.getTitle(),
blog.getContent()
);
}

return blog;
}

在清單 9 中,我使用一個數(shù)據(jù)庫作為檢索 blog 對象的替代機制。根據(jù)另一種機制檢索該對象時,應該將該對象設置為緩存,以便下一次檢索可以直接從該緩存獲取這個對象。

如清單 10 所示, setBlog 方法將 blog 對象放在緩存中。這個方法比較簡單,因為它只是使用傳入的信息創(chuàng)建一個新的 blog 對象,然后將這個對象放在緩存中。


清單 10. 通過 blog 管理器將 blog 對象放在緩存中
            
public boolean setBlog(int bId, String author, Date date, String title, String content) {
BlogObject blog = new BlogObject(bId, author, date, title, content);

try {
blogCache = JCS.getInstance(blogCacheRegion);
blogCache.put(bId, blog);
return true;
} catch (CacheException ce) {
return false;
}
}

如清單 11 所示, cleanBlog 方法要么從緩存中清除一個指定的 blog,要么從緩存中清除掉所有 blog。這個方法使用 JCS 的 remove clear 方法來清除緩存對象。


清單 11. 通過 blog 管理器從緩存中刪除 blog 對象
            
public boolean cleanBlog(int blogId) {
try {
blogCache = JCS.getInstance(blogCacheRegion);
blogCache.remove(blogId);
} catch (CacheException ce) {
return false;
}
return true;
}

public boolean cleanBlog() {
try {
blogCache = JCS.getInstance(blogCacheRegion);
blogCache.clear();
} catch (CacheException ce) {
return false;
}
return true;
}

前面的幾個類展示了使用 JCS 緩存對象是很簡單的。擁有對象管理器并使用簡單的對象表示之后,您就獲得一種在 Web 應用程序中處理對象的簡單但強大的方法。





緩存元數(shù)據(jù)

JCS 提供了更多方法,向應用程序添加緩存所用的方法只是其中的一小部分。例如,它提供了收集緩存對象和緩存區(qū)域元數(shù)據(jù)的實用程序。您可以輕松檢索以下內(nèi)容:

  • 緩存鍵名稱
  • 創(chuàng)建緩存項的時間
  • 緩存可以存在的最長時間
  • 緩存過期時間

清單 12 中的例子顯示如何檢索緩存項的元數(shù)據(jù):


清單 12. 檢索緩存項的元數(shù)據(jù)
            
try {
JCSAdminBean admin = new JCSAdminBean();
LinkedList linkedList = admin.buildElementInfo(regionName);
ListIterator iterator = linkedList.listIterator();

while (iterator.hasNext()) {
CacheElementInfo info = (CacheElementInfo)iterator.next();
System.out.println("Key: " + info.getKey());
System.out.println("Creation Time: " + info.getCreateTime());
System.out.println("Maximum Life (seconds): " + info.getMaxLifeSeconds());
System.out.println("Expires in (seconds): " + info.getExpiresInSeconds());
}
} catch (Exception e) {
}

緩存項的元數(shù)據(jù)很有用,但獲取各個緩存區(qū)域的元數(shù)據(jù)也很有幫助。這個信息讓您知道緩存有多少數(shù)據(jù),它們會進入哪個區(qū)域,包括緩存丟失、緩存提示和緩存更新。清單 13 中的示例顯示如何獲得此信息:


清單 13. 檢索緩存區(qū)域的元數(shù)據(jù)
            
try {
JCSAdminBean admin = new JCSAdminBean();
LinkedList linkedList = admin.buildCacheInfo();
ListIterator iterator = linkedList.listIterator();

while (iterator.hasNext()) {
CacheRegionInfo info = (CacheRegionInfo)iterator.next();
CompositeCache compCache = info.getCache();
System.out.println("Cache Name: " + compCache.getCacheName());
System.out.println("Cache Type: " + compCache.getCacheType());
System.out.println("Cache Misses (not found): " + compCache.getMissCountNotFound());
System.out.println("Cache Misses (expired): " + compCache.getMissCountExpired());
System.out.println("Cache Hits (memory): " + compCache.getHitCountRam());
System.out.println("Cache Updates: " + compCache.getUpdateCount());
}
} catch (Exception e) {
}

收集緩存區(qū)域和項的元數(shù)據(jù)能幫助您分析 Web 站點的哪些區(qū)域和項目需要優(yōu)化。元數(shù)據(jù)也能幫助您管理時間敏感型的緩存數(shù)據(jù)。例如,您可以使用每個緩存項的最長生命周期和過期時間來為需要更新數(shù)據(jù)的特定用戶刷新緩存數(shù)據(jù)。





結(jié)束語

JCS 是為 Java 開發(fā)人員提供的功能強大但簡單易用的緩存系統(tǒng)。它為桌面和類似的 Web 應用程序提供數(shù)據(jù)緩存。類似桌面的 Web 應用程序的發(fā)展前景是提高速度和敏捷性。緩存數(shù)據(jù)對這些方面非常有益。本文概述如何配置和使用 JCS。此外,還討論了基本緩存方法所需要語法,以及如何在常見 Web 應用程序中緩存對象和檢索緩存元數(shù)據(jù)。解了 JCS 的基本知識之后,您現(xiàn)在可以利用數(shù)據(jù)緩存功能來開發(fā)下一個 Web 站點了。您還可以學習其他幾個提供高級功能的 JCS 區(qū)域,比如 HTTP Servlet 訪問、JCS 實用程序、基本 HTTP 驗證和其他輔助區(qū)域。



參考資料

學習

獲得產(chǎn)品和技術(shù)
  • JCS :下載 JCS。

  • 下載 IBM? 產(chǎn)品評估版 ,試用這些來自 DB2?、Lotus?、Rational?、Tivoli? 和 WebSphere? 的應用程序開發(fā)工具和中間件產(chǎn)品。


關(guān)于作者


Kellen Bombardier 是 IBM 的軟件工程師,他還是 Information Management 團隊的開發(fā)人員。

使用緩存構(gòu)建更快的 Web 應用程序


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久精品国产400部免费看 | 国内精品免费久久久久妲己 | 国产羞羞视频在线播放 | 色噜噜狠狠成人中文小说 | 日韩精品中文字幕在线观看 | a视频在线播放 | 国产高清久久99 | 精品国产成人三级在线观看 | 免费观看成人www精品视频在线 | 韩国精品一区二区久久 | 天天想夜夜操 | 九九免费视频 | 18视频在线观看 | 亚洲免费成人 | 欧美精品久久久久久久免费观看 | 成人毛片一区二区三区 | 久草视频免费在线播放 | 久久久国产精品视频 | 日韩精品一区二区三区中文在线 | 日本高清视频一区二区三区 | 99re这里只有精品国产精品 | 狠狠狠色丁香婷婷综合久久五月 | 日本大臿亚洲香蕉大片 | 久久99精品久久久久子伦 | 国产高清视频 | 欧美色爱综合网 | 国产精品久久久久这里只有精品 | 久久影片 | 国内自拍网红在线综合 | 成人国产激情福利久久精品 | 欧美午夜艳片欧美精品 | 久久麻豆视频 | 尹人成人 | 日日操综合 | 亚欧洲精品bb | 婷婷丁香亚洲 | 日韩免费毛片 | 久久精品成人免费网站 | 免费观看一区二区 | 97影院理论片手机在线观看 | 一区二区三区四区在线观看视频 |