Ehcache

298 阅读3分钟

简介

ehcache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider
它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,支持REST和SOAP api等特点

主要特性

  1. 快速、简单
  2. 多种缓存策略 提供LRU、LFU和FIFO缓存策略
  3. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
  4. 缓存数据会在虚拟机重启的过程中写入磁盘
  5. 可以通过RMI、可插入API等方式进行分布式缓存
  6. 具有缓存和缓存管理器的侦听接口
  7. 提供Hibernate的缓存实现

使用介绍

架构图

  1. Cache Replication:这个模块主要负责缓存同步的几种实现,主要包括TerraCotta、RMI、JMS、JGroup四种方式
  2. In-process APIs:这个模块主要包括Ehcache对外常用的API
  3. Network APIs:这个模块主要包括的是Ehcache的通信协议,主要有RESTful API、SOAP API、JMS API
  4. Ehcache Core:核心部分
  • CacheManager: 缓存管理器,可以通过单例或者多例的方式创建,也是Ehcache的入口类
  • Cache:每个CacheManager可以管理多个Cache,每个cache可以采用hash的方式管理多个Element
  • Element:用于存放真正的缓存内容

缓存数据过期策略

  • FIFO:根据数据的写入时间,数据先进先出
  • LFU:最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存
  • LRU:最近最少使用,缓存的元素有一个时间戳,当缓存容量满了,现有缓存元素中时间戳离当前时间最远的元素将被清出缓存
算法名称 存在的问题
LRU 会存在一次冷数据的批量查询而误淘汰大量热点的数据
LFU 会导致最近新加入的数据总会被很容易被剔除掉
FIFO 这种算法有其特殊的使用领域,比如在作业调度、消息队列等方面

基本使用方法

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
	updateCheck="true" name="shiroCache">

	<diskStore path="/data/html/ehcache/sh" /><!--达到内存上限后缓存文件保存位置-->

	<defaultCache maxElementsInMemory="10000" <!--cache 中最多可以存放的元素的数量-->
	    eternal="false"<!--是否永驻内存。如果值是true,cache中的元素将一直保存在内存中,不会因为时间超时而丢失,所以在这个值为true的时候,timeToIdleSeconds和timeToLiveSeconds两个属性的值就不起作用了-->
		timeToIdleSeconds="120"<!--访问这个cache中元素的最大间隔时间。如果超过这个时间没有访问这个cache中的某个元素,那么这个元素将被从cache中清除-->
		timeToLiveSeconds="86400"<!--cache中元素的生存时间。意思是从cache中的某个元素从创建到消亡的时间,从创建开始计时,当超过这个时间,这个元素将被从cache中清除-->
		overflowToDisk="true" <!--溢出是否写入磁盘-->
		diskSpoolBufferSizeMB="30"  <!--设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB-->
		maxElementsOnDisk="10000000" <!--磁盘中最大元素数量 -->
		diskPersistent="false" <!--是否持久化磁盘缓存-->
		diskExpiryThreadIntervalSeconds="120" <!--磁盘缓存的清理线程运行间隔-->
		memoryStoreEvictionPolicy="LRU" <!--内存存储与释放策略-->  
		/>

	<cache name="fillSettleData" maxElementsInMemory="10000" eternal="false"
		   timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false" />

</ehcache>

结合spring使用

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
		<property name="cacheManager" ref="cacheManagerFactory" />
	</bean>

	<cache:annotation-driven cache-manager="cacheManager" />

	<bean id="cacheManagerFactory"
		  class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
		<property name="configLocation" value="WEB-INF/env/ehcache.xml" />
		<property name="shared" value="true" />
	</bean>