使用缓存构建更快的 Web 应用程序
使用 Java™ 技术的 Web 开发人员可以使用缓存实用程序快速提升他们的应用程序的性能。Java 缓存系统(Java Caching System,JCS)是一个用于 Java 应用程序的强大分布式缓存系统,它是拥有简单 API 的高度可配置的工具。本文将概述 JCS 并展示如何使用它来提高 Web 应用程序的速度。
|
|
清单 1. JCS 的基本配置
jcs.default=jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributesjcs.default.cacheattributes.MaxObjects=1000jcs.default.cacheattributes.MemoryCacheName= org.apache.jcs.engine.memory.lru.LRUMemoryCache |
LRUMemoryCache
。还可以看到,内存中能保存的对象的最大数量被设置为 1000
。
OUR_REGION
)时使用了一个内存区域和一个磁盘区域:
清单 2. 在 JCS 配置中定义的区域
jcs.default=DISK_REGIONjcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributesjcs.default.cacheattributes.MaxObjects=1000jcs.default.cacheattributes.MemoryCacheName= org.apache.jcs.engine.memory.lru.LRUMemoryCache jcs.region.OUR_REGION=DISK_REGIONjcs.region.OUR_REGION.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributesjcs.region.OUR_REGION.cacheattributes.MaxObjects=1000jcs.region.OUR_REGION.cacheattributes.MemoryCacheName= org.apache.jcs.engine.memory.lru.LRUMemoryCachejcs.region.OUR_REGION.cacheattributes.UseMemoryShrinker=truejcs.region.OUR_REGION.cacheattributes.MaxMemoryIdleTimeSeconds=3600jcs.region.OUR_REGION.cacheattributes.ShrinkerIntervalSeconds=60jcs.region.OUR_REGION.cacheattributes.MaxSpoolPerRun=500jcs.region.OUR_REGION.elementattributes=org.apache.jcs.engine.ElementAttributesjcs.region.OUR_REGION.elementattributes.IsEternal=false jcs.auxiliary.DISK_REGION=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactoryjcs.auxiliary.DISK_REGION.attributes= org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributesjcs.auxiliary.DISK_REGION.attributes.DiskPath=c:/jcs/disk_regionjcs.auxiliary.DISK_REGION.attributes.maxKeySize=100000 |
|
DISK_REGION
。 DISK_REGION
是 IndexedDiskCacheFactory
类型,并且该文件在磁盘上指定为 c:\jcs\disk_region。清单 2 中的第二个配置组定义了我自己的区域,我为它添加了一些选项,这种类型的配置(在指定用户定义区域时同时使用内存区域和磁盘区域)是很常见的。清单 2 中的第 3 个配置组定义了一个 辅助区域。
concurrent
和 commons-logging
(JCS 1.2.7.0 之前的版本中,还有两个其他依赖项: commons-collections
和 commons-lang
)。
|
清单 3. 检索默认缓存区域
// Initialize the JCS object and get an instance of the default cache regionJCS cache = JCS.getInstance("default"); |
put
方法将一个新对象放入缓存中。接下来只需一个 key
(第一个参数)和一个 value
(第二个参数)。清单 4 显示一个基本示例:
清单 4. 设置缓存项
// Set upString key = "key0";String value = "value0"; // Place a new object in the cachecache.put(key, value); |
get
方法。清单 5 显示了一个简单示例。同样,本例使用了一个字符串参数,但您可以使用任何对象。
清单 5. 检索缓存项
// Retrieve a cached objectString cachedData = (String)cache.get(key); |
get
方法的返回值可以帮助您。清单 6 显示了一种获得此必要功能的方式:
清单 6. 测试缓存项的有效性
// Retrieve a cached objectString cachedData = (String)cache.get(key); // Check if the retri. workedif (cachedData != null) { // The cachedData is valid and can be used System.out.println("Valid cached Data: " + cachedData);} |
clear
方法,用于从调用的缓存区域中删除所有缓存数据。此外,还提供了一个 remove
方法,用于删除指定缓存项。 dispose
方法也可以处理初始化的 JCS 区域。清单 7 显示了如何使用这些方法:
清单 7. 清除缓存区域
// Dispose of a specific cached itemcache.remove(key); // Dispose of all cache datacache.clear(); // Dispose of the cache regioncache.dispose(); |
|
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 对象
- 在缓存中设置 blog 对象
- 从缓存中清除 blog 对象
getBlog
方法检索 blog 对象。该方法首先试图从缓存获得 blog 对象。如果该对象不在缓存中,它将根据其他机制获取该对象:
清单 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;} |
setBlog
方法将 blog 对象放在缓存中。这个方法比较简单,因为它只是使用传入的信息创建一个新的 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; }} |
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;} |
|
- 缓存键名称
- 创建缓存项的时间
- 缓存可以存在的最长时间
- 缓存过期时间
清单 12. 检索缓存项的元数据
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) {} |
清单 13. 检索缓存区域的元数据
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) {} |
|
学习
- 您可以参阅本文在 developerWorks 全球网站上的 英文原文。
- Java Caching System:JCS 的官方网站。
- Java 缓存系统 API:JCS 的 API 文档。
- Ehcache:Ehcache 是另一个用于 Java 应用程序的多用途缓存系统。
- OSCache:OSCache 是一个专门处理 JSP 内容缓存的缓存系统。
- cache4j:一个用于 Java 对象的简单缓存器。
- IBM Cache Advisor:Cache Advisor 是一个智能建议工具,能提供最优化的缓存建议。
- 在 技术书店 浏览关于这些主题和其他技术主题的图书。
- developerWorks Java 技术专区:提供了几百篇有关 Java 编程各个方面的文章。
获得产品和技术
- JCS:下载 JCS。
- 下载 IBM® 产品评估版,试用这些来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
Kellen Bombardier 是 IBM 的软件工程师,他还是 Information Management 团队的开发人员。
|
转载于:https://blog.51cto.com/cping1982/129574
使用缓存构建更快的 Web 应用程序相关推荐
- 我如何构建Kubernetes集群,以便我的同事可以更快地部署应用程序
by cheungpat 通过cheungpat 我如何构建Kubernetes集群,以便我的同事可以更快地部署应用程序 (How I built a Kubernetes cluster so my ...
- 使Gradle构建更快 2016年2月5日奥列格Shelajev3评论 推特 inShare 70 上次我们谈到了构建系统,我们看着一些建议可能会使您的Maven构建更快。我们得到的结果是迷人的和对
使Gradle构建更快 2016年2月5日 奥列格Shelajev 3评论 推特 inShare70 上次我们谈到了构建系统,我们看着一些建议可能会使您的Maven构建更快.我们得到的结果是迷人的和对 ...
- 构建meteor应用程序_我构建了一个渐进式Web应用程序并将其发布在3个应用程序商店中。 这是我学到的。...
构建meteor应用程序 by JudahGabriel Himango 犹大(Gabriel Himango) 我构建了一个渐进式Web应用程序并将其发布在3个应用程序商店中. 这是我学到的. (I ...
- angular input_更快的Angular应用程序
更快的Angular应用程序 应用程序的运行时性能完全掌握在开发者自己手中.接下来,我们以一个简单的应用来演示如何进行性能优化. 一个简单的应用 我们将会在这个应用程序中,一步一步的引入所有可行的性能 ...
- Nest的基本概念,以及如何使用Nest CLI来构建一个简单的Web应用程序
Nest是一个用于构建高效.可扩展的Node.js服务器端应用程序的框架.它是基于Express.js构建的,并且提供了多种新特性和抽象层,可以让开发者更加轻松地构建复杂的应用程序. 本文将介绍Nes ...
- web自动化构建_通过在真实设备上进行自动测试来构建更好的Web
web自动化构建 This article was originally published on Medium. 本文最初发表在Medium上 . My work is entirely dedic ...
- 如何在一天内构建和部署机器学习web应用程序 — 榴莲分类
本文我将带领大家构建一个Web应用程序以对榴莲进行分类,在这里(https://durian-classifier.herokuapp.com/) 可以查看相关信息. 如果你不知道榴莲是什么,那我向你 ...
- 使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第1部分
在这一系列博客文章中,我们将使用以下技术堆栈构建完整的响应式Web应用程序: 1)弹簧靴 – Spring MVC网站 – Spring Data JPA –Spring安全 2)Thymeleaf用 ...
- web服务弹性伸缩_我如何为实际用户构建可伸缩的现代Web应用程序
web服务弹性伸缩 This post details the languages, libraries, and tools that I'm using to build Skilled.dev, ...
最新文章
- zabbix服务器性能监控工具的安装二
- Android ListViewDemo
- Android高通平台下编译时能生成(拷贝)预编译的so到system的lib目录
- Android开发_如何调用系统默认浏览器访问
- 安全警报 该站点安全证书_深度学习如何通过实时犯罪警报确保您的安全
- iOS----------UITextField实现过滤选中状态拼音
- Exchange Server 2003 部署手册
- python应声虫代码_前端大牛们都学过哪些东西?
- iOS Xcode7上真机调试
- 备战2019年数据库系统工程师从什么时候开始合适?
- 使用 GO-CQHttp或mirai框架 搭建QQ的机器人
- 实现spring+mybatis+uncode dal,应用自动切换连接数据库
- View和ViewGroup的概念
- 05.Django基础五之django模型层(一)单表操作
- 盘点那些年,被Oracle收购的公司
- 解决Windows10家庭版系统无法安装Docker Desktop问题
- 消除桌面上的计算机名称,Win10桌面图标有小箭头怎么去掉?Win10去掉桌面图标小箭头的方法...
- 阿里巴巴校招实习生一面记录
- vue动态添加图片/背景图
- 教你配电脑:电脑小白如何选购笔记本电脑,笔记本性能知识,干货来了