一:接口和类的作用:
Elemenet:
key
value
lastAccessTime
hitCount
等描述cache中元素的信息。
Store: 实际上存放Element的对象,Cache针对对象的操作一般都委托Store对象。
- MemoryStore: 继承该类来实现自定义MemoryStore。该类存放数据时,先使用Map存放数据,然后再判断是否超出容量。
put()
doPut() // 用来清理元素
-LruMemoryStore.java 使用 LinkedHashMap的子类,doput()为空,因为该map的实现中的removeEldestEntry方法清理了超出容量的元素。
-LfuMemoryStore.java 使用HashMap
-FifoMemoryStore.java 使用LinkedHashMap 这里用队列应该更快吧??源码中还需要遍历map。
-DiskStore:
其实diskStore也是用一个hashmap来存放数据,只有显式的调用flush()方法的时候才判断是否要将元素写入文件中。
CacheManager 来管理 Cache ;
Cache用来操作Element,Cache是抽象出来的逻辑概念,其 内部使用Store来处理Element
Element就是数据描述缓存对象的基本信息。
Store是保管缓存对象的仓库,这个仓库分Memory和Disk两种。
EHCache中的EventListener是针对分布式的,普通的应用可以不用考虑。
二:一些功能细节:
1:超出设定的元素容量的解决方法
MemoryStore:
When an element is added to a cache and it goes beyond its maximum memory size,
an existing element is either deleted, if overflowToDisk is false, or evaluated for spooling to disk,
if overflowToDisk is true. In the latter case, a check for expiry is carried out. If it is expired it is deleted; if not it is spooled.
判断元素是否过期,MemoryStore有3种策略可选,LRU,LFU,FIFO,默认为LRU。
DiskStore:
使用LFU,DiskStore使用一个守护线程,DiskStore.SpoolAndExpiryThread内部类来定时检查diskStore中的元素,
定时刷新到文件中,如果遇到过期的元素则移除。
2:元素存活时间到期
MemoryStore:
在get()和超出容量的时候才判断是否过期
DiskStore:
只有在flush的时候才判断是否过期,如果过期则移除。
也就是说,这两种方式,不论在文件或者内存中,都会依然存在过期的元素,
这些元算可能永远存在,但不影响我们的操作,因为我们get()或者超出容量的时候都会判断是否过期并清除。
三:初始化
CacheManager cacheManager = new CacheManager();
调用protected void init(Configuration configuration, String configurationFileName, URL configurationURL, InputStream configurationInputStream) 方法进行初始化。
1:解析配置信息:
1.1 查找ehcache.xml文件,如果找不到则使用默认的ehcache-failsafe.xml,返回一个URL对象。
1.2 调用ConfigurationFactory.parseConfiguration(input) 方法来进行解析。返回Configuration对象。
Configuration的数据结构:
private DiskStoreConfiguration diskStoreConfiguration;
private CacheConfiguration defaultCacheConfiguration;
private List<FactoryConfiguration> cacheManagerPeerProviderFactoryConfiguration = new ArrayList<FactoryConfiguration>();
private List<FactoryConfiguration> cacheManagerPeerListenerFactoryConfiguration = new ArrayList<FactoryConfiguration>();
private FactoryConfiguration cacheManagerEventListenerFactoryConfiguration;
private final Map cacheConfigurations = new HashMap();
private String configurationSource;
该数据结构是针对xml定义来的,其中最复杂也最常用的算是CacheConfiguration,其内部结构也很简单。
cacheConfigurations存放多个CacheConfiguration。
2:根据Configuration进行CacheManager,Cache,Store等数据结构的初始化。
总结:
EHCache是一款比较简单的开源缓存产品,但也存在一些不足之处:
比如:
1:CacheManager和Cache这个具体类耦合,当然也提供了针对EHCache接口的方法,如果使用自定义的Cache的话容易混淆方法。
2:针对不同的Cache类,我们希望指定不同的MemoryStore实现、DiskStore实现,EHCache只提供了通过程序来达到这一功能,
没有提供通过配置文件来提供(类似于Hibernate配置文件中CacheProvider,JDBC dialect 等)。
3:有些算法实现得不算好,比如FifoMemoryStore.java中的清理元素算法选择的数据结构不够快速。
分享到:
相关推荐
#### 四、小结 通过对Ehcache缓存配置的深入了解,我们可以更加高效地利用其强大的缓存功能来优化应用性能。无论是在单机还是分布式环境下,合理配置Ehcache都可以帮助开发者解决各种缓存相关的挑战。
本文将围绕“Spring小结之配置二级缓存”这一主题,详细阐述二级缓存的概念、作用以及如何在Spring中进行配置。 首先,二级缓存是指在应用程序中的第一级缓存(通常是数据库连接池提供的缓存)之外的另一层缓存机制...
4. **自定义缓存实现**:Spring支持多种缓存实现,如EhCache、 Hazelcast、Infinispan、Guava等。开发者可以根据需求选择合适的缓存库,并通过配置实现类来连接Spring的缓存抽象层。 5. **缓存配置**:在XML或Java...
- 缓存策略:利用缓存(如Redis、Ehcache)减少数据库访问,提高性能。 - 分页查询:避免一次性加载大量数据,使用分页查询减少内存消耗。 - 数据库连接池:配置合适的连接池,如Druid、HikariCP,优化数据库连接...
* shiro-ehcache:用于集成 Ehcache 到 Shiro 中。 * slf4j-api:用于日志记录。 * shiro-core:Shiro 的核心依赖。 * shiro-web:用于集成 Shiro 到 Web 项目中。 * shiro-spring:用于集成 Shiro 到 Spring 项目中...
SpringBoot 使用 Cache 缓存过程代码... 小结 本文详细介绍了 SpringBoot 使用 Cache 缓存过程代码实例,包括 Ehcache 缓存框架的配置和使用方法。通过使用 Cache 缓存机制,应用程序可以大幅度提高性能和响应速度。
- **2.4 resultType和resultMap实现一对一查询小结**:比较两种映射方式的特点和适用场景。 ##### (二)一对多查询 - **3.1 需求**:查询订单及其对应的订单详情信息。 - **3.2 SQL语句**:SELECT * FROM Orders ...
Spring Boot Actuator监控端点小结 在传统Spring应用中使用spring-boot-actuator模块提供监控端点 Spring Boot应用的后台运行配置 Spring Boot自定义Banner Dubbo进行服务治理 chapter9-2-1:Spring Boot中使用Dubbo...
- **resultMap小结**:总结resultMap的使用技巧。 - **延迟加载**:优化性能的关键技术。 - **打开延迟加载开关**:全局设置延迟加载。 - **一对一查询延迟加载**:具体实现方法。 - **一对多延迟加载**:具体...
#### 六、小结 通过上述内容的学习,我们对Hibernate 3 的基础知识有了初步的认识,了解了它的历史背景、基本配置方法以及简单的O/R映射示例。随着深入学习,我们将探索更多高级特性,如缓存管理、事务处理以及更...
小结 本文主要介绍了SpringBoot Redis分布式缓存实现过程解析,通过示例代码详细介绍了分布式缓存的实现过程,并对大家的学习或者工作具有一定的参考学习价值。分布式缓存是提高系统性能和增加系统吞吐量的重要手段...
- [Spring Boot Actuator监控端点小结](http://blog.didispace.com/spring-boot-actuator-1/) - [在传统Spring应用中使用spring-boot-actuator模块提供监控端点]...