华南俳烁实业有限公司

java

當(dāng)前位置:中華考試網(wǎng) >> java >> javaWeb >> 文章內(nèi)容

使用緩存構(gòu)建更快的javaWeb應(yīng)用程序

來(lái)源:中華考試網(wǎng)  [2020年12月2日]  【

  使用 Java 技術(shù)的 Web 開(kāi)發(fā)人員可以使用緩存實(shí)用程序快 速提 升他們的應(yīng)用程序的性能。Java 緩存系統(tǒng)(Java Caching System,JCS)是一個(gè)用于 Java 應(yīng)用程序的強(qiáng)大分布式緩存系統(tǒng),它是擁有簡(jiǎn)單 API 的高度可配置的工具。本文將概述 JCS 并展示如何使用它來(lái)提高 Web 應(yīng)用程序的速度。

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

  JCS 概述

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

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

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

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

  JCS 配置

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

  清單 1 顯示的是最基本的 cache.ccf 文件 — 一個(gè)純內(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)存緩存指定為一個(gè) LRUMemoryCache。還可以看到,內(nèi)存中能保存的對(duì)象的最大數(shù)量被設(shè)置為 1000。

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

|

  填寫下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽(tīng)java課程!害怕學(xué)不會(huì)?助教陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國(guó)推薦就業(yè)!

java課程免費(fèi)學(xué)習(xí),高薪觸手可得

  • 地區(qū):
  • 姓名:
  • 手機(jī):

  清單 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 的基本用法

  學(xué)習(xí) JCS 基礎(chǔ)知識(shí)的一個(gè)好方法是查看 API 最常用的方法。最好從初始化區(qū)域開(kāi)始。初始化 JCS 緩存區(qū)域?qū)ο竽苁鼓L問(wèn)大部分所需的常用方法。清單 3 初始化 JCS 對(duì)象并獲得一個(gè)默認(rèn)緩存區(qū)域?qū)嵗?/P>

  清單 3. 檢索默認(rèn)緩存區(qū)域

    
// Initialize the JCS object and get an instance of the default cache region
JCS cache = JCS.getInstance("default");

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

  清單 4. 設(shè)置緩存項(xiàng)

    
// Set up
String key = "key0";
String value = "value0";
// Place a new object in the cache
cache.put(key, value);

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

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

  清單 5. 檢索緩存項(xiàng)

    
// Retrieve a cached object
String cachedData = (String)cache.get(key);

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

  清單 6. 測(cè)試緩存項(xiàng)的有效性

    
// 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);
}

  最后需要幾個(gè)用于在使用 JCS、緩存項(xiàng)和緩存區(qū)域后清除它們的常用緩存實(shí)用程序。JCS 提供了一種 clear 方法,用于從調(diào)用的緩存區(qū)域中刪除所有緩存數(shù)據(jù)。此外,還提供了一個(gè) remove 方法,用于刪除指定緩存項(xiàng)。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();
#FormatImgID_0#
#FormatImgID_1#

  JCS 和 Java 對(duì)象

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

  設(shè)計(jì)一個(gè)簡(jiǎn)單的面向?qū)ο蟮?JCS 站點(diǎn)的第一個(gè)步驟是創(chuàng)建需要存儲(chǔ)的對(duì)象。在本例中,我將開(kāi)發(fā)一個(gè)基本 blogging 站點(diǎn)。清單 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;
}
}

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

  檢索 blog 對(duì)象

  在緩存中設(shè)置 blog 對(duì)象

  從緩存中清除 blog 對(duì)象

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

  清單 9. 通過(guò) blog 管理器檢索 blog 對(duì)象

    
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 中,我使用一個(gè)數(shù)據(jù)庫(kù)作為檢索 blog 對(duì)象的替代機(jī)制。根據(jù)另一種機(jī)制檢索該對(duì)象時(shí),應(yīng)該將該對(duì)象設(shè)置為緩存,以便下一次檢索可以直接從該緩存獲取這個(gè)對(duì)象。

  如清單 10 所示,setBlog 方法將 blog 對(duì)象放在緩存中。這個(gè)方法比較簡(jiǎn)單,因?yàn)樗皇鞘褂脗魅氲男畔?chuàng)建一個(gè)新的 blog 對(duì)象,然后將這個(gè)對(duì)象放在緩存中。

  清單 10. 通過(guò) blog 管理器將 blog 對(duì)象放在緩存中

    
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 方法要么從緩存中清除一個(gè)指定的 blog,要么從緩存中清除掉所有 blog。這個(gè)方法使用 JCS 的 remove 和 clear 方法來(lái)清除緩存對(duì)象。

  清單 11. 通過(guò) blog 管理器從緩存中刪除 blog 對(duì)象

    
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;
}

  前面的幾個(gè)類展示了使用 JCS 緩存對(duì)象是很簡(jiǎn)單的。擁有對(duì)象管理器并使用簡(jiǎn)單的對(duì)象表示之后,您就獲得一種在 Web 應(yīng)用程序中處理對(duì)象的簡(jiǎn)單但強(qiáng)大的方法。

#FormatImgID_2#
#FormatImgID_3#

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

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

  緩存鍵名稱

  創(chuàng)建緩存項(xiàng)的時(shí)間

  緩存可以存在的最長(zhǎng)時(shí)間

  緩存過(guò)期時(shí)間

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

  清單 12. 檢索緩存項(xiàng)的元數(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) {
}

  緩存項(xiàng)的元數(shù)據(jù)很有用,但獲取各個(gè)緩存區(qū)域的元數(shù)據(jù)也很有幫助。這個(gè)信息讓您知道緩存有多少數(shù)據(jù),它們會(huì)進(jìn)入哪個(gè)區(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ū)域和項(xiàng)的元數(shù)據(jù)能幫助您分析 Web 站點(diǎn)的哪些區(qū)域和項(xiàng)目需要優(yōu)化。元數(shù)據(jù)也能幫助您管理時(shí)間敏感型的緩存數(shù)據(jù)。例如,您可以使用每個(gè)緩存項(xiàng)的最長(zhǎng)生命周期和過(guò)期時(shí)間來(lái)為需要更新數(shù)據(jù)的特定用戶刷新緩存數(shù)據(jù)。

#FormatImgID_4#
#FormatImgID_5#

  結(jié)束語(yǔ)

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

  如果你現(xiàn)在想學(xué)習(xí)Java,贏取高薪工作機(jī)會(huì),非常簡(jiǎn)單,填寫下面信息,學(xué)好Java技術(shù)高薪工作機(jī)會(huì)唾手可得。

 

責(zé)編:fushihao
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語(yǔ)考試
  • 學(xué)歷考試
鹿泉市| 砚山县| 玛纳斯县| 建湖县| 林甸县| 香河县| 布拖县| 江安县| 厦门市| 洛川县| 邹平县| 疏勒县| 靖江市| 龙川县| 吉隆县| 新河县| 阿尔山市| 赫章县| 侯马市| 绍兴县| 涡阳县| 罗源县| 驻马店市| 安岳县| 临武县| 香格里拉县| 隆回县| 武汉市| 桐城市| 舟山市| 隆林| 昌宁县| 安丘市| 额敏县| 永州市| 独山县| 二连浩特市| 马龙县| 札达县| 托克逊县| 东乌|