使用JCS在Web门户应用中实现对象缓存
- 格式:doc
- 大小:160.00 KB
- 文档页数:13
cacheable key为对象
Cacheable key 可以是一个对象,在缓存中用于唯一标识缓存的对象。
为了使一个对象能够作为 cacheable key,它必须满足两个条件:
1.唯一性:cacheable key 必须能够唯一地标识一个对象,以便在缓存中进行查找和比较。
2.可序列化:cacheable key 必须能够序列化和反序列化,以便存储在缓存中和从缓存中读取。
例如,一个 cacheable key 可以是一个包含多个属性的 Java 对象,其中每个属性都是唯一的,而且对象本身实现了Serializable 接口,以便能够在缓存中进行序列化和反序列化。
在使用 cacheable key 时,需要注意的是,为了确保缓存的正确性和一致性,缓存的 key 应该是不可变的,即不可改变的对象。
这是因为如果一个对象在缓存中被修改了,而它又作为缓存的 key,那么在进行查找和比较时会出现问题,导致缓存的不一致性。
同时,在设计 cacheable key 时,还需要考虑到对象的hashCode() 和 equals() 方法的正确实现,以确保对象在缓存中能够正确地被比较和查找。
cache的用法Cache的用法Cache(缓存)是一种用于存储临时数据的技术,可以提高数据的访问速度和系统的性能。
在软件开发中,Cache有多种用法,下面将详细介绍其中一些常见的用法。
1. 网页缓存静态文件缓存静态文件如CSS、JavaScript和图片等,在第一次请求后可以被服务器缓存到浏览器本地,之后再次请求时直接从缓存读取,减少了网络传输时间和服务器负载。
页面片段缓存部分动态内容如导航菜单、热门文章列表等,在后端生成后可以缓存在服务器端,下次请求时直接从缓存中获取,减少数据库查询和页面渲染时间。
2. 数据库缓存查询结果缓存数据库查询是消耗资源的操作,可以将查询的结果缓存在内存中,下次查询同样的数据时直接从缓存读取,避免了再次访问数据库。
对象级缓存一些常用的业务对象如用户信息、商品信息等,可以将其缓存在内存中,避免频繁的数据库查询操作,提高系统响应速度和并发能力。
3. 键值对缓存键值对缓存是将数据以键值对的形式存储在内存中,常用于缓存一些常用的配置参数、临时计算结果等。
它可以快速地读写数据,并可以设置过期时间,一般使用LRU(最近最少使用)算法进行缓存数据的清理。
4. HTTP缓存HTTP缓存是通过设置HTTP头信息的方式进行缓存的。
可以通过设置Expires头字段或Cache-Control头字段来控制缓存的过期时间和缓存策略。
如果服务器返回的响应带有相同的URL和头字段,则客户端可以直接从缓存获取数据,减少了网络传输时间。
5. 代码缓存编译型语言的代码在每次运行前都需要经过编译的过程,可以将编译后生成的中间代码或机器码缓存起来,下次运行时直接加载缓存,减少编译时间,提高系统性能。
6. CDN缓存内容分发网络(CDN)是一种分布式系统,可以将文件缓存到离用户更近的服务器上,用户在访问网站时可以从相对较近的服务器获取文件,减少了网络延迟和传输时间,提高了访问速度。
以上是一些常见的Cache(缓存)的用法,通过合理使用Cache,可以显著提升系统的性能和用户体验。
JBossCache 讲解说明是什么?一个树形结构、支持集群、支持事务的缓存技术。
有什么作用?JBoss Cache是针对Java应用的企业级集群解决方案,其目的是通过缓存需要频繁访问的Java对象,提高应用的可用性并大幅度提升应用的整体性能。
JBoss Cache这样的分布式缓存扮演的是一个处于应用服务前端和数据库间的中间层的角色,提供对持久性数据状态在内存中的快速访问。
JBoss Cache能够确保缓存中的数据状态和数据库中的状态一致、及时更新数据状态、并且保证JVM不会出现堆溢出问题。
为什么不使用Map?很多人认为Map是考虑缓存的出发点(实际上,JSR-107 JCACHE专家组曾经在Map的基础上扩展实现javax.cache.Cache)。
尽管Map非常适合用来存储简单的键/值对,在缓存必需的其它特性上,它就难免有点黔驴技穷,比如内存管理(eviction)、钝化(passivation)和持续性、细粒度锁定模型(首先,HashMap根本不是线程安全的;而ConcurrentHashMap采用的锁是粗粒度级的,它甚至不允许非阻塞用户或多用户从map中读取数据)等。
而对于“合格的”缓存来说,它还需要具备一些“企业”特性,包括JTA兼容、附加侦听器等功能。
Map虽然是个好的起点,但如果需要实现或者管理我刚才提到的那些特性的话,选择缓存还是要比Map来得更合适一些。
JBossCache的缓存方式JBoss Cache提供两种缓存方式:核心缓存(TreeCache)和POJO缓存(TreeCacheAOP)核心缓存: 会直接把传递给它的数据存储在一个树型结构中。
键/值对被存储在树的节点上,出于复制或持续性的需要它们都被序列化了POJO 缓存: 则采用比较复杂的机制——利用字节码编织来内省(introspecting)用户类,并向用户类的域添加侦听器,一旦域值有任何变化,侦听器会立刻通知缓存。
《Web应用开发》选择题(含参考答案)参考教材:《Java Web应用开发渐进教程》,唐建平主编,清华大学出版社,2014年1月。
=== Java EE基础 ===1. 以下哪些是Java EE体系架构的优点?选择是__________。
(多选)A. 不依赖硬件和操作系统B. 程序运行速度快C. 提高Windows系统服务器效率D. 方便企业信息系统集成答案:AD2. 以下有关Java EE技术的描述中,哪种说法是正确的?选择结果是__________。
A. 是动态网页的设计工具B. 是一个标准中间件体系结构C. 是一种计算机编程语言D. 是企业编写Java语言的工具答案:B3. 以下哪些是JAVA EE框架的服务技术?选择是__________。
(多选)A. Web服务技术B. 安全技术C. 持久化技术D. 数据连接技术答案:ABCD4. 以下哪些是J2EE的客户端组件?选择是__________。
(多选)A. Java BeanB. 客户端应用程序C. APPLETD. Web浏览器答案:BCD5. 以下哪些是Java EE标准组件?它们是__________。
(多选)A. JSPB. JDKC. JFrameD. Servlet答案:AD6. 以下哪些是Java EE标准组件?它们是__________。
(多选)A. JSPB. ServletC. EJBD. Java答案:ABC8. 下列有关Java EE用途的说法,哪种是正确的?请选择一个正确的答案是__________。
A. 规范分布式多层企业应用系统的开发B. 设计动态网页C. 设计桌面应用程序D. 设计网络管理程序答案:A10. 下列有关Java EE技术的陈述中,哪种说法是正确的?选择结果是__________。
A. Java EE是一个标准中间件体系结构B. Java EE一门编程语言C. 一种编写Java语言的工具D. 设计动态网页的工具答案:A11. 在Java Web开发中,要在服务器端查询cookie, 要用到HttpServletRequest 的哪个方法?选择是_______。
java cache用法Java中的缓存是一种常用的数据结构,用于提高应用程序的性能和响应速度。
Java提供了多种缓存实现,如JavaCache、Ehcache、GuavaCache等,这些缓存可以存储数据并在需要时快速检索。
本篇文章将介绍JavaCache的使用方法。
JavaCache是一个简单的缓存实现,它提供了一个易于使用的API,可以方便地添加、获取和移除缓存数据。
JavaCache的设计目标是易于使用、高性能和可扩展性。
它支持通过多个存储引擎来扩展缓存,每个存储引擎都具有不同的性能特点。
1.添加缓存数据使用JavaCache添加缓存数据非常简单。
首先,需要创建一个Cache对象,并指定存储引擎的类型和名称。
然后,可以使用put方法将数据添加到缓存中。
例如:```javaCachecache=newCache("myCache",100);//创建一个缓存对象,存储引擎类型为Memory,容量为100个字节cache.put("key","value");//将数据添加到缓存中```2.获取缓存数据使用JavaCache获取缓存数据也非常简单。
可以使用get方法从缓存中获取数据。
如果数据不存在于缓存中,则返回null。
例如:```javaStringvalue=cache.get("key");//从缓存中获取数据```3.移除缓存数据使用JavaCache移除缓存数据也非常简单。
可以使用remove方法从缓存中移除指定的数据。
例如:```javacache.remove("key");//从缓存中移除数据```4.配置存储引擎和缓存容量JavaCache支持多个存储引擎,每个存储引擎具有不同的性能特点。
可以通过配置存储引擎的类型和名称来扩展缓存。
此外,还可以配置缓存的容量,以确保缓存不会因为存储空间不足而出现性能问题。
使用JCS在Web门户应用中实现对象缓存(1) 使用JCS在Web门户应用中实现对象缓存 在我最近的web门户应用开发工作中,我们需要在Servlet容器(Tomcat)的内存中存储一些查找数据(例如:比率更新数据、状态和产品列表),这样我们不需要在每次访问数据的时候进行数据库查找。同时,我们也需要定期地刷新存储在内存中的数据以保证其新鲜和准确。我们也需要一种机制在不同的时间间隔对存储在内存中的不同类型的数据进行刷新。例如,比率更新数据需要每天刷新一次,而查找类型的数据则可以在内存中保留很长一段时间。对象缓存是最方便地达到上述所有目的的完美解决方案。 对象缓存 最恰当的对象缓存的定义可以在Object Caching Service for Java (OCS4J)的功能规范文档中找到 ,它是这样定义的: 服务器必须将信息和可执行对象分为三种基本类别管理: 永远不会改变的对象,每次请求都会发生改变的对象,以及在两者之间的对象。Java对前两种对象的处理提供了很好的支持,但是对第三种类别的支持非常有限。如果对象永远不改变,我们在服务器初始化的时候创建静态对象。如果对每个请求对象都是不同的,我们每次都创建新的对象。对于介于两者之间的对象或信息,它们的状态可能会发生变化,但是又需要提供跨越请求、跨越用户或跨越进程的共享,就要采用“对象缓存服务”了。 基本上,对象缓存就是通过在使用对象后不立即释放,而是存储在内存中并被后来的客户端请求重用,避免重新获得对象的昂贵成本。当数据第一次从数据源被检索出来后,在名为cache的内存缓冲中临时存放。 同样的数据再次被访问的时候,对象从缓存中取出来,而不是从数据源重新获取。最后,被缓存的数据在不再需要的时候从内存中释放出来。从Web应用的观点来看,什么时候指定的对象可以从内存中释放出来取决于定义一个对象变成无效的合理的间隔时间。 缓存的益处 对象缓存最主要的益处就是对应用性能的重大提升。在一个多层应用中,与其他工作比较,数据访问是一种代价非常高的操作。通过将频繁被访问的数据By keeping the frequently accessed data around并在第一次使用后不释放,我们可以避免重新获取与释放对象的开销和时间。这将会大规模提升web应用的性能,因为我们不用在每次获取数据的时候访问数据库了。 可伸缩性是使用对象缓存带来的另一个好处。因为被缓存的数据可以跨越多个session和web应用 访问,对象缓存可以成为可伸缩性Web应用设计的一个重要部分。采用对象缓存,就像对象池一样,可以帮助避免获取与释放对象的开销。 缓存的不利因素 在web应用中使用对象缓存可以带来很多益处,但是缓存对象同时也会带来一些不利的因素。 同步复杂性: 复杂性的增长依赖于数据的种类,因为需要保证被缓存数据与数据源中原始数据的一致性。要不然,被缓存的数据就会与实际数据不一致,将会导致应用中的数据错误。 Durability: 当服务器崩溃的时候,被缓存数据的修改回丢失。可以采用同步缓存避免该问题。 内存大小: 如果有大量没有用处的数据存放在缓存中,并且这些数据没有在正常的时间间隔内被释放,JVM内存大小就会变得无法接受的庞大。 缓存实例 任何不经常变化的、需要花费很长时间从数据源获取的数据都是缓存的最佳选择。这包括了几乎所有的静态数据、代码和描述列表,以及带有分页功能的查找结果 (搜索结果可以从数据源一次获取出来并存放在缓存中,等待用户在结果页面上点击页数链接时显示)。 中间件技术如EJB和CORBA允许在客户端与服务器之间的远程对象传输。像这种类型的访问,也被称为 粗粒度数据访问,用于降低昂贵的远程方法调用开销。如果这些数据传输对象 (也被称为值对象)变化不是非常频繁,它们可以被存储在缓存中。这样可以在每次客户端需要值对象时减少servlet容器访问应用服务器的次数。 那么哪些类型的数据不宜被缓存呢?这里是一些不推荐使用缓存的数据类别: 可以被网站上其他用户访问的安全信息。 用户描述信息。 私人信息,包括社会保险号码或信用卡明细信息。 经常变化的,并且不准确或不及时会引发问题的业务信息。 不应该被其它用户访问的特定于Session的数据。 使用JCS在Web门户应用中实现对象缓存(2) 缓存架构 有很多种对象缓存架构(包括开放源代码的和商业的实现)在servlet容器和应用服务器中提供了分布式缓存。下面列出了一些现在可以使用的缓存框架: 开放源代码项目 来自于Jakarta的Java Caching System (JCS) (属于Turbine项目的一部分) OSCache Commons Collections (另一个Jakarta项目) JCache API (SourceForge.net) 商业项目 SpiritCache (来自于 SpiritSoft). Coherence (Tangosol) Javlin (eXcelon) Object Caching Service for Java (Oracle) 如果你还有兴趣了解更多的缓存实现,本文最后的资源一节提供了所有这些框架的URL。 我在最初开始我对能满足我们所有的缓存需求的框架进行研究的时候,我先看到了Commons Collections和 Java Caching System API。我在最开始评估的主要标准就是容易使用、容易扩展,以及软件的成本。这两个框架都是开放源代码的,并且都来自于Apache Jakarta项目。 Commons Collections Commons Collections API以一个Java类的形式提供了对象缓存算法,名称为
LRUMap。如果你对缓存只有基本的需求,并且不是真正需要很多的扩展和缓存配置功能,那么Commons Collections可能是一个不坏的选择,但不是作为一个企业级缓存系统的正确选择。如果你选择Common Collections来实现对象缓存,你将会手工定义/配置所有的缓存参数,如:最大缓存对象的数量,一个缓存对象的最长生命周期,刷新缓存或检查对象新鲜的中断时间等。 Java Caching System Java Caching System (JCS), Jakarta Turbine项目的一部分, 与Commons Collections相比更有成熟、更具扩展性。通过为频繁访问的对象维护动态对象池的方法,它提供了提升整个系统性能的灵活、可配置的解决方案。就像在它的网站上提到的,JCS已经超越了简单地在内存中缓存对象的范围。它为一个企业级的缓存系统提供了许多必需的重要功能: 内存管理 Disk overflow (和重整) 元素分组 快速嵌套地移除 数据期限管理 可扩展的框架 完全可配置的运行时参数 远程同步 远程存储恢复 通过HTTP、TCP或者UDP协议实现可选的横向分布元素。 JCS提供了无故障点的框架, 允许完全的session失败转移(在集群环境中),包括支持最多到256个服务器的session数据分布。它也提供了配置一个或多个数据存储选项的灵活性,例如:内存缓存、磁盘缓存,或者在远程机器上的缓存。 所有这些包括在JCS中的优秀功能让它成为满足我们的web门户项目的一个优秀的对象缓存产品选择 使用JCS构造Web门户缓存框架 缓存框架的目标 在我开始设计对象缓存框架之前,我首先列出了在新的框架中需要达到的目标。以下就是目标的列表: 在web门户应用中快速访问频繁使用的数据。 将缓存中类型类似的对象进行组合。 提供可配置的缓存管理,以便我可以通过描述方式而不是编码方式修改参数。 提供可靠的和可扩展的框架,以便我将来可以转换到其它第三方的缓存API。 可以生成统计数据来监测缓存的效率,以及使用数据缓存后应用性能的提升效果。 安装和配置 在web应用中安装和配置JCS是非常简单的事情。从Jakarta Turbine网站下载
压缩文件,解压缩文件到临时目录,并拷贝JSC.jar文件(jcs-1.0-dev.jar)到servlet容器的通用目录(在我的web应用中使用的servlet容器是Tomcat,通用目录在windows下就是%TOMCAT_HOME%\common\lib,在再Unix类型的系统下就是$TOMCAT_HOME/common/lib)。你可能还需要commons-collections.jar, commons-lang.jar,和 commons-logging.jar 这些
文件存在于web应用的类路径下以便使用JCS。 对象缓存框架的主要原理在图1和图2的UML图中展示出来了 图1 图2 使用JCS在Web门户应用中实现对象缓存(3) 框架的主要原理 缓存属性 我们将所有的缓存参数配置在名为cache.ccf的属性文件中。这些参数包括缓存信息如:内存中存储的对象的最大数量,缓存时间(过了时间之后缓存的数据九自动从内存中释放),中断时间(elapsed time since last access time), 内存缓存名称(例如:缓存算法如LRU或MRU)等。在当前版本的JCS中,缓存属性文件是纯文本格式的。SpiritCache framework,一种来自SpiritSoft的Jcache API商业实现,支持XML格式的缓存配置。 确认该属性文件存放在类路径中。注意:如果你需要使用其它不同的文件来存放缓存属性的话,JCS也提供了方法来指定一个配置文件的名称。请参考JCS的 Javadocs学习如何从其它非缺省的属性文件中读取缓存配置信息。 下面列出来的是web应用使用缓存功能需要了解的一些Java类。这些类存放在本文的示例代码的common.caching包中。这些类的Javadocs也包括在源代码压缩包中。 (图2中的类图显示了这些Java类的关系) ICacheManager 这是客户应用实现所有缓存有关操作(如:存储、访问以及释放缓存中的数据)的主接口(契约)。客户程序可以是JSP、Struts Action类,或者就是一个POJO对象。创建该接口用于对客户端隐藏所有缓存的实现细节,这样当我们将来需要切换另一种的第三方缓存API的时候无需对客户端代码做任何调整。 BaseCacheManager
这是web门户缓存框架的主类。是对ICacheManager 接口的最基本实现。创建BaseCacheManager 用于在一个类中集中所有缓存相关的方法。它被设计为单例模式保证在servlet容器的JVM中有且仅有一个ICacheManager 的实例被创建。在多web服务器/servlet容器实例共同处理web请求的集群环境中,每个JVM将会创建独立的ICacheManager 实例。如果将来你要转换到不同的