Ehcache简介

作者: royal_47a2 | 来源:发表于2018-05-23 16:55 被阅读0次

    Ehcache是一个开源、基于标准的缓存,可提升性能、减小数据库负载、简化可扩展性。是使用最广泛的基于java的缓存,因为它健壮性、经过验证的、全特性、和与其他流行的库和框架进行整合。

    Ehcache是一个纯java的进程内缓存框架,具有快速、精干的特点。是hibernate默认的cacheprovider。Ehcache是一种广泛试用的java分布式缓存。主要面向通用缓存、jaVa ee和轻量级容器。具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

    Spring提供了对缓存功能的抽象:及允许绑定不同的缓存解决方案(如ehcahce),但本身不提供缓存功能的实现。他支持注解方式使用缓存。

    2、主要的特性有

    1、快速

    2、简单

    3、多种缓存策略

    4、缓存数据有两级:内存和磁盘,因此无须担心容量问题

    5、缓存数据会在虚拟机重启的过程中写入磁盘

    6、可通过RMI、可插入APi等方式进行分布式缓存

    7、具有缓存和缓存管理器的监听接口

    8、支持多缓存管理器示例,以及一个实例的多个缓存区域

    9、提供hibernate的缓存实现

    3、集成

    可以单独使用,一般在第三方库中被用到的较多,对分布式支持不够好,多个节点不能同步,通常和redis一起使用。

    4、ehcache和redis比较

    ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。

    redis是通过socket访问到缓存服务器,效率比ehcache低,比数据库快。处理集群和分布式缓存方便,有成熟的方案。如果单个应用对缓存访问要求高可用ehcache,如果是大型系统,存在缓存共享、分布式部署、缓存内容大,建议用redis。

    ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但涉及缓存恢复、大数据缓存,则不适合。

    5、getting start

    开始使用Ehcache,需要先配置cache manager和cache,可通过编程的方式和xml的方式进行配置。

    编程方式配置

    cachemanager 管理cache

    acheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withCache("preConfigured", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10)));

    Cache preConfigured = cacheManager.getCache("preConfigured", Long.class, String.class);

    XML配置

    <config>

    <cache alias="foo">//别名foo

    <key-type>java.lang.String</key-type>//指定建类型,若不指定则是Object类型

    <value-type>java.lang.String</value-type>//指定值类型,若不指定则是Object类型

    <resource>

    <heap unite="entries">2000</heap>

    <offheap unit-"mb">600</offheap>

    </resource>

    </cache>

    <cache-template name="myDefault">//cache模版,可被继承使用

    <key-type>java.lang.Long</key-type>

    <value-type>java.lang.String</value-type>

    <heap unit="entries">200</heap>

    </cache-template>

    <cache alias="bar" uses-template="myDefault">//继承myDefault模版,并覆盖key类型

    <key-type>java.lang.Number</key-type>

    </cache>

    </config>

    Ehcache 层次缓存选项

    ehcache支持基于层的缓存。

    移出堆内存:

    1、当添加一个映射到缓存,需要将key和value序列化2、当读取一个映射,需要将key和value反序列化。

    序列化和反序列化影响缓存性能

    单一层设置

    ehcahce所有的层可单独配置,有

    heap堆内存,最快的层,不须经过序列化和反序列化

    offheap对外内存,移出heap需经序列化和反序列化,较heap要满

    disk磁盘,持久化,在jvm重启时缓存会保留下来

    clustered集群,需Terracotta Server Array 

    多层同时配置,需注意

    1、多层配置时,必需有heap层

    2、disk和clustered不能同时配置

    3、各层应使用金字塔是配置,即下层存储要大于上层的存储空间

    层次结构

    资源池

    一般使用ResourcePoolBuilder,资源池只是制定配置,不是实际的一个可被缓存使用的池。

    更新资源池,可在正被使用的cache上对资源池的配置进行修改,但可修改是有限的

    销毁持久层,PersistentCacheManager.destroy()方法

    多层缓存操作中的序列化流

    put过程 get过程

    当put一个值到cache,直接会存到author层,最底层

    get操作会把值推到cacheing层

    只要值被put到author层,全部的高层都置无效

    全部访问未命中都会访问到author层为止

    创建集群支持的缓存管理

    1、启用 Terracotta服务,配置集群存储

    集群框架

    因为ehcache对于分布式共享并不是很好的支持,故不详细说明,与redis结合是更好的方式。

    相关文章

      网友评论

        本文标题:Ehcache简介

        本文链接:https://www.haomeiwen.com/subject/voxndftx.html