前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ehcache配置+Spring 原

Ehcache配置+Spring 原

作者头像
克虏伯
发布2019-04-15 14:43:24
9300
发布2019-04-15 14:43:24
举报

以下内容是根据JSR107-Java-Caching-API,加上平时的使用总结的。

注:建议在读下面的内容之前,先去了解下JSR107中的内容,trust me!

一、Fundamentals

1. JSR107中定义了五种core interfaces

  • CachingProvider
  • CacheManager
  • Cache
  • Entry(这个Entry就是放入到Cache中的key-value键值对)
  • ExpiryPolicy(过期策略)

    对上图的说明:一个Application可以使用多个CachingProvider;每个CachingProvider可以管理多个CacheManager;每个CacheManager可以管理多个Cache;每个Cache中可以有多个Entry。在Spring中使用这个Ehcache时,就需要定义CacheManager的name和CacheManager中管理的Cache。

2. Store-By-Value 和 Store-By-Reference

    Entry存储在Cache中时,有俩种机制: Store-By-Value和Store-By-Reference。

  • Store-By-Value: JSR107中规定,在将Entry存储到Cache时,对Key和Value进行拷贝,而后实际存储到Cache中的是这个拷贝值;从Cache中读取时,实际拿到的只是Cache中Entry的拷贝值。所以Store-By-Value时即使对对象进行了修改,也不会影响到Cache中对应的Entry。
  • Store-By-Reference: JSR107中规定,这种方式是引用存储,存入到Cahe中的是引用,从Cache中返回的也是引用,所以在使用这种方式时,一定要注意修改带来的相互影响。

        实际使用时是Reference还Value类型,可自行写几行代码验证下,本人验证了下,在不配置特殊参数的情况是Reference类型。 

       由于JSR107只是规范,而实际的每个厂商底层实现的不同,加上可能写到磁盘或者Ehcache集群(Entry要在网络中传输),所以Entry中的key和value最好都实现java.io.Serializable。

二、Ehcahce与Spring

1. ehcache配置的例子

    如下是ehcache配置文件,暂且将该文件命名为ehcache.xml(后面说明中要用到)。

代码语言:javascript
复制
<?xml version="1.0"?>
<ehcache xmlms:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="ehcache.xsd">
	<diskStore path="java.io.tmpdir" />
	<cache name="userCache" maxElementsInMemory="1000" eternal="false"
		timeToIdleSeconds="0" timeToLiveSeconds="10" overflowToDisk="false"
		memoryStoreEvictionPolicy="LFU" />
</ehcache>

2. Spring中使用ehcache的例子

    Spring中使用ehcache.xml如下图所示,由EhcacheManagerFactoryBean源码可知,这个ehcache.xml被用于创建一个CacheManager。Spring容器中userCacheManager对应的bean是一个CacheManager(如果觉得困惑,那么先去了解下org.springframework.beans.factory.FactoryBean的作用——Mybatis的SqlSessionFactoryBean也使用了FactoryBean的功能,而后再去看下EhCacheManagerFactoryBean的源码)。

代码语言:javascript
复制
<bean id="userCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
	<property name="configLocation" value="classpath:ehcache.xml"/>
    <property name="cacheManagerName" value="userCacheManager"/>
</bean>

    至此我们就有了一个name为userCacheManager的CacheManager,之后就可以使用name为userCache的Cache了。

三、Ehcache的xml配置

     这种xml配置一般都有一个schema用于约束xml节点或节点属性的值以及类型。所以可以先去看下ehcache官方给出的ehcache.xsd,Spring中用于配置bean的xml也有它自己的schema,而且Spring的xsd在细节、注释上比ehcache的好。

1. ehcache元素中允许出现的元素类型

    下图上框中ref的值是ehcache节点中允许的元素种类;下框中name的值是ehcache节点的属性name。比如从下图中可以看出ehcache节点中可以出现0个或多个cache元素;但是diskStore只能出现0个或者1个;ehcache的属性updateCheck的默认值是true。

    配置很多,这里就不细细列出了,建议去查看下官方的ehcache.xsd。

四、结尾

     最近在看Ehcache的实现,发现其底层用到了LinkedHashmap、ConcurrentHashmap,且在此基础之上做了一定的个性化,但是如何做到element的searchable、写到disk等是如何实现,目前还没看到。待后续努力。

    在此,建议开发人员多去了解下JCP的规范,对了解框架有很大的帮助,比如

  1. Servlet规范(为什么Spring在web.xml中定义DispatcherServlet,如果不了解Servlet的执行流程,我觉得是难以看懂SpringMVC模块代码的)
  2. Jms规范(为什么创建connection的方式有多种)
  3. Java Transaction API (JTA)规范(为什么Spring中涉及事物时会有个ResourceManager)
  4. Jdbc规范(transaction、isolation、distributed transaction)

    同样,我们在设计框架时,应该注重规范化,参考JCP的相应规范,比如Spring batch模块就遵循了batch规范,这样框架才会易于学习、传播。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/03/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Fundamentals
    • 1. JSR107中定义了五种core interfaces
      • 2. Store-By-Value 和 Store-By-Reference
      • 二、Ehcahce与Spring
        • 1. ehcache配置的例子
          • 2. Spring中使用ehcache的例子
          • 三、Ehcache的xml配置
            • 1. ehcache元素中允许出现的元素类型
            • 四、结尾
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档