对缓存的使用主要是领会它的原理,知道为什么要使用缓存,然后对实现进行了解,有4种缓存的实现,我这里说一下常用的Ehcache缓存;它的精髓就在于ehcache.xml的配置,具体实例和解义如下:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
monitoring="autodetect" dynamicConfig="true">
<!--DiskStore 配置,cache文件的存放目录 ,主要的值有
*user.home - 用户主目录
* user.dir - 用户当前的工作目录
* java.io.tmpdir - Default temp file path默认的temp文件目录
-->
<diskStore path="java.io.tmpdir"/>
<!--
指定CacheManagerEventListenerFactory,这个对象在缓存添加的时候会得到相应的通知
*class - CacheManagerEventListenerFactory的一个实现类
*properties - CacheManagerEventListenerFactory的属性值,以逗号(,)分割多个属性,如果没有实现类被指定,则系统不创建CacheManager的监听器,没有默认值
-->
<cacheManagerEventListenerFactory class="" properties=""/>
<!--
在进行分布式缓存的应用时候需要指定CacheManagerPeerProviderFactory,
用来生成CacheManagerPeerProvider的实例,以便和集群中的其他CacheManager通信。
*class -CacheManagerPeerProviderFactory的一个实现类
*properties - CacheManagerPeerProviderFactory的属性值,以逗号(,)分割多个属性
Ehcache内建了2种基于RMI分布系统的通信策略(peerDiscovery):
*automatic - 使用多播组。在一个节点加入或者推出集群的时候自动感应(或者说自动在局域网内部查找分布的peer)
*manual - 硬编码方式,使用它的时候,需要手动指定节点的地址,rmiUrls="//server1/aaa|//server2/bbb";
-->
<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic;
multicastGroupAddress=230.0.0.1;
multicastGroupPort=40001;"
propertySeparator=","/>
<cacheManagerPeerListenerFactory/>
<!--
必须属性:
name:设置缓存的名称,用于标志缓存,惟一
maxElementsInMemory:在内存中最大的对象数量
maxElementsOnDisk:在DiskStore中的最大对象数量,如为0,则没有限制
eternal:设置元素是否永久的,如果为永久,则timeout忽略
overflowToDisk:是否当memory中的数量达到限制后,保存到Disk
可选的属性:
timeToIdleSeconds:设置元素过期前的空闲时间
timeToLiveSeconds:设置元素过期前的活动时间
diskPersistent:是否disk store在虚拟机启动时持久化。默认为false
diskExpiryThreadIntervalSeconds:运行disk终结线程的时间,默认为120秒
memoryStoreEvictionPolicy:当内存缓存达到最大,有新的element加入的时候,移除缓存中element的策略(以下三种)
1、 FIFO,first in first out,这个是大家最熟的,先进先出。
2、 LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
3、 LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
【注】:默认的Cache配置。用来实现CacheManager.add(String cacheName)创建的缓存
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
<!--
[首先,你可以有多个cache]
可对缓存中的element配置诸如监听器和加载器。Ehcahe内建了一些:
*cacheEventListenerFactory - 监听缓存中element的put, remove, update和expire事件
*bootstrapCacheLoaderFactory - 启动时加载缓存的element
每个用来做分布式缓存都必须设定element的事件监听器,用来在各个CacheManager节点复制消息。
Ehcache内建了基于RMI的实现 - RMICacheReplicatorFactory
-->
<cache name="personList"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="300"
overflowToDisk="true"
maxElementsOnDisk="1000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU">
<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
<!-- 也可以在这里自己写监听器(在缓存element的put,remove等操作时,做一些额外的操作) -->
</cache>
</ehcache>
然后对写一个类,生成CacheManager,很简单,不在赘述,看代码:
public class DwrEhcache {
private static CacheManager cacheManger;
public static synchronized CacheManager getInstace(){
if(cacheManger==null){
InputStream is = ClassLoader.getSystemResourceAsStream("ehcache.xml");
cacheManger = new CacheManager(is);
}
return cacheManger;
}
private static Cache getCache(String name){
Cache cache = DwrEhcache.getInstace().getCache(name);
return cache;
}
public static void shutdown(){
if(cacheManger!=null){
cacheManger.shutdown();
}
}
public static Cache getPersonList(){
return DwrEhcache.getCache("personList");
}
}
最后对上篇dwr博文进行一些小小的改动,就做到了使用缓存技术,当然不要使用RMI分布式缓存,那样没什么意思【在这里有点大材小用了】,呵呵;好了,看代码吧,简单的很:
public List<PersonBean> getAllPerson(){
ArrayList<PersonBean> persons = null;
Cache cache = DwrEhcache.getPersonList();
ArrayList<PersonBean> list = new ArrayList<PersonBean>();
try {
list = (ArrayList<PersonBean>)cache.get("personList").getObjectValue();
persons = (ArrayList<PersonBean>)list.clone();
} catch (Exception e) {
list = null;
}
if(list == null){
persons= new ArrayList<PersonBean>();
PersonBean p1 = new PersonBean("Lucy",12,"女");
PersonBean p2 = new PersonBean("Jam",13,"男");
persons.add(p1);persons.add(p2);
Element element = new Element("personList",persons);
cache.put(element);
System.out.println("手动添加的,不是从缓存中读取的....");
}
return persons;
}
一些OK,运行DWR项目,成功了、
分享到:
相关推荐
以下是对OSCache配置和使用过程的详细说明: 1. **下载与安装**: 首先,从官方网站http://www.opensymphony.com/oscache/download.html下载适合的OSCache版本。然后,将解压后的`oscache.jar`文件放入项目中的`/...
查询缓存是针对数据库查询结果的缓存,它保存特定查询的数据结果,当下次执行相同查询时,直接从缓存中读取数据,不再执行数据库查询。这种方式需要缓存机制能够识别并匹配相同的查询语句,以便提供正确的缓存内容。...
使用 Redis 实现页面缓存 本文档主要介绍了使用 Redis 实现页面缓存的方法...总结:使用 Redis 实现页面缓存可以提高网站的访问速度和用户体验。通过设计合理的缓存 key 和缓存实现思路,我们可以实现高效的页面缓存。
接着,我们创建了一个`Element`对象,其中包含了要缓存的键值对,并使用`cache.put()`方法将其放入缓存。读取缓存时,我们使用`cache.get()`方法,如果找到对应的键,则返回对应的Element对象,从中提取出缓存的对象...
总结:缓存技术是优化系统性能的关键,选择合适的缓存策略和技术对提高应用的响应速度和用户体验至关重要。在实际开发中,根据具体需求选择Nginx、Redis、Memcached等工具,并结合业务逻辑设计合理的缓存管理机制,...
本文主要总结了ASP.NET中的各种缓存策略及其应用。 首先,我们要了解缓存的基本类型。根据位置,缓存可以分为浏览器端缓存和服务器端缓存。 1. 浏览器端缓存:通过设置HTTP响应头,如`Last-Modified`和`If-...
SSH框架中的Hibernate是负责数据库操作的部分,而Hibernate的二级缓存是一种跨会话的缓存机制,它可以存储在多个会话之间共享的数据,以减少对数据库的访问次数,从而提高系统性能。二级缓存主要分为以下两个层面: ...
**Hibernate 二级缓存总结整理** 在Java的持久化框架中,Hibernate是一个广泛使用的ORM(对象关系映射)工具,它极大地简化了数据库操作。在处理大数据量或高并发的场景下,为了提高性能和减少数据库负载,...
- MEMORY缓存不支持统一的失效策略,适合对内存使用没有严格限制的场景。 2. **LRU (com.ibatis.db.sqlmap.cache.lru.LruCacheController)** - LRU缓存采用最近最少使用的算法来管理缓存。当缓存达到指定的最大...
文档"Hibernate_二级缓存总结 开发技术 - Java.doc"可能详细阐述了如何配置和使用Hibernate的二级缓存,包括配置文件的设置、缓存提供者的选用、实体和集合的缓存配置,以及实战中的优化技巧。阅读该文档将有助于...
在PHP开发中,文件缓存是一种常见的优化策略,它能够减少服务器对数据库的访问,提高网站性能。本文将深入探讨PHP文件缓存方法,并通过一个简单的缓存类`cache`来展示其实现。 首先,文件缓存的基本原理是将动态...
本篇文章将深入探讨如何在Geoserver中配置图层缓存,以及缓存对性能的影响。 一、图层缓存的重要性 图层缓存是Geoserver优化性能的关键机制之一。当用户请求地图时,Geoserver会预先渲染图层并将其存储在硬盘上,...
### 如何不使用Ajax缓存 在Web开发中,Ajax技术因其异步通信特性而被广泛应用,但在实际项目中可能会遇到缓存问题,比如在进行数据更新操作时(如删除、修改),由于浏览器缓存的存在导致请求返回的是之前的数据...
- **配置复杂**:二级缓存需要在Hibernate配置文件中指定缓存提供商,并对实体类进行配置,以便它们能够参与缓存。 - **缓存策略**:二级缓存支持不同的缓存策略,如读写策略、只读策略、定时刷新策略等,可以根据...
- **`Cache-Control`**:控制缓存行为,如`no-cache`表示不使用缓存,需要从源服务器验证资源。 - **`Expires`**:指定资源的有效期限。设置为负数表示立即过期。 这些设置可以确保客户端每次请求都获取最新的内容...
Redis实现缓存功能总结 Redis 是 NoSQL 数据库中应用最广泛的场景之一,就是做缓存,分布式系统有很多位置需要缓存,例如共享 session,读取业务数据缓存,分布式锁等。今天我们将总结 Spring Boot 集成 Redis 实现...
EHcache是一款广泛使用的Java缓存框架,尤其在SSH(Spring、Struts、Hibernate)这样的企业级开发环境中,它能够有效地提升应用的运行效率。本文将详细探讨如何在SSH架构中手动配置和使用EHcache。 首先,我们需要...