`
阅读更多
  初次学习cache接触到的Ehcache这个框架。缓存这个概念只让我想起hibernate里面的缓存,不过这都是hibernate自己做的,和自己都没什么关系。为什么要用到缓存,这个貌似应该都知道。
  首先接触Ehcache没有去学习Ehcache的一些基本东西,反而是看整个系统是怎么用它的。
  系统刚跑起来的时候数据不是很多,全部查找出来放入到缓存里面,对每个bean对象都建立了2个缓存。刚开始不知道Ehcache是怎么存的,但是看代码明白有Key,Value二个,key存放id,value存放相应的bean,这就是一个缓存。另一个了,key放条件,value放id。想了好久才明白为什么创建2个,感觉这样挺好的。
  数据放进了Ehcache里面后,该是查数据的时候了。查数据是怎么的顺序了?首先是根据条件查询存放id的那个缓存,如果查询出来的id值不为空,则获得一个listid,然后遍历list,得到id去查询存放bean的缓存。如查到的id为空,则根据条件去存放bean的缓存里去查(查到后,还记得要把条件和id放到缓存里面去)。若根据id去查,和根据条件去查都没有的话,就只能去查数据库了,查完后要把查得到都要放到那二个缓存里面去,这就是查询的逻辑。
  数据放入缓存后,缓存的数据不应该是不变的,因为数据库的数据要更新,那么缓存的数据也应该更新。那怎么做呢?不知道应用的是否观察者模式,但挺像的,对各个bean对象监听起来,监察是否对数据库有改变,那具体监测哪一块了?数据发生变化那么大家肯定会想到事物,数据要提交到数据库里,肯定要调用的transaction,所以在调用commit()方法时,那么就可以通知到相对应bean的缓存了,及时更新。大家初学语言的时候都碰到过这个问题,值传递和引用传递,引用传递在方法里面改变了值,那引用对象的值也变了,涉及到缓存也一样,你从缓存获取出来的对象都是引用类型的,你临时取出来用一下,改变了值,那么缓存也变了,可是数据库没变啊,所以有时结果就出错了,记得取出来的对象一定要重新new一个(把旧对象的值赋值给新的)。

  简单的缓存应用大概是这样的了,我所知道的。 该是要把Ehcache给了解一下了,ehcache若简单应用,其实很容易。主要学会2个地方,ehcache.xml和EQL。
  首先我说下ehcache.xml
 
<ehcache>
    <diskStore path="java.io.tmpdir"/>
    <defaultCache maxElementsInMemory="10000" eternal="false"
                  overflowToDisk="false" timeToLiveSeconds="180"
                  diskPersistent="false" diskExpiryThreadIntervalSeconds="120" />
    <cache name="PersonBean"
                  memoryStoreEvictionPolicy="LRU"
                  maxElementsInMemory="10000" overflowToDisk="false" eternal="true">
       <searchable>
           <searchAttribute name="N" expression="value.getName()"/>
       </searchable>
    </cache>
</ehcache>
  

diskStore缓存数据文件创建的地方
maxElementsMemory缓存中可以存放的最大元素量,若overflowToDisk为true,超过了则写到磁盘中,一般不会这样做。若为false则按Eviction的策略来替换元素
eternal设置元素是否永恒,则超时策略被忽略,就是timeLive和timeToIdle这二个失效。但仍然遵守替换原则
overflowToDisk设置元素超出最大量时是否保存在磁盘中
timeLiveSeconds设置元素生存时间,到时就被销毁,默认是没有限制
timeToIdleSeconds设置元素空闲时间,意思是一直没有被访问,到达这个时间则销毁,默认没限制
memoryStoreEvictionPolicy设置缓存替换策略,这让我想起了上操作系统这门课时,老师给我们讲的,现在还真的要用上了。
  LRU:least recently used 最近最少使用
  LFU:least frequently used 最不经常使用
  FIFO:first in first out 先入先出
searchAttribute定义查找属性
在工程里我定义了PersonBean这个类,包含了id,name,year,sex属性及其get,set方法。我直接用PersionBean这个名字做为缓存的名字,而这个缓存就是存放PersonBean对象,所以在expression中name的值是value.getName()。

看一下Ehcache的简单代码
CacheManager cacheManager = CacheManager.getInstance();
Ehcache ehcache = cacheManager.getEhcache("PersonBean");
PersonBean perb = new PersonBean();
perb.setId(1);
perb.setName("liuq");
ehcache.put(new Element(1,perb));
Element element = ehcache.get(1);
Object object = element.getObjectValue();

从代码里大家可以看见Ehcache存放的结构。Ehcache管理许多cache,而我们的需要存放的东西是用Element存放在cache中的,以key,value的形式。cache的创建可以写在配置文档里,也可以用编码实现,不过建议是写在文档里,直观。在调用CacheManager.getInstance()时,会自动到src目录下找,名字必须为ehcache.xml.
创建CacheManager还有其它方法,这就看API可以知道。慢慢的越来越发现API是个好东西,以前都是直接看别人写出来,其实还不如自己看API,要养成好习惯。

然后再看一下对cache的查询
Query query = ehcache.createQuery().includeKeys().includeValues();
//Attribute n = ecache.getSearchAttribute("N");
//Criteria c = n.eq("liuq");
//query.addCriteria(c);
query.addCriteria(new Attribute("N").eq("liuq")).end();
//query.addCriteria(Query.KEY.eq(1)).end();  
Results result = query.execute();
for (Result re : result.all()) {
   PersonBean pb = (PersonBean) re.getValue();
   System.out.println(pb.getName());
}     

在Ehcache中查询,也叫EQL。大家可以去官网看一下详细的介绍http://ehcache.org/documentation/apis/search,只是官网是英语的,需要你花时间,但许多东西,看官网的还是觉得好一些。EQL查询步骤其实很简单,创建一个Query,加入查询条件,最后执行得到结果,复杂的是你的查询条件。要做EQL,必须要加入searchable属性,不然会出错的。大家可以看到Attribute是我定义在searchable里面,expression就是类中的getName(),这样才能够得到liuq这个值去匹配。还有其中includeKeys,和includeValues记得加进去,因为re.getKey和re.getValue需要。

  这仅仅是一个简单的了解,至于应用还没怎么学会,需要继续努力学,然后分享更多的知识,若有不对的地方,希望大家能及时指出来。
分享到:
评论

相关推荐

    jdbc连接cache的demo及jar包,自己备份.rar

    【标题解析】 标题"jdbc连接cache的demo及jar包,自己备份.rar"指出这是一个关于使用JDBC(Java ...示例代码可以帮助初学者或者有经验的开发者快速理解和实现Cache数据库的JDBC连接,从而进行数据查询、更新等操作。

    Cache数据库入门基础

    对于初学者,可以通过在线文档、官方教程和社区论坛获取学习资料。InterSystems社区活跃,开发者们可以在这里交流经验,解决问题,共同推动Cache技术的发展。 总的来说,Cache数据库是医疗行业的重要技术基石,它的...

    cache数据库资料1

    - **“Cache数据库管理.pdf”**:这本书可能涵盖了数据库的安装、配置、性能调优以及日常维护等方面的知识,是初学者入门的必备参考资料。 - **“Caché 面向对象软件开发教程(版本1.1).pdf”**:面向对象编程是...

    Cache数据库安装及编程相关资料

    总之,这个压缩包中的资料将涵盖Cache数据库的基础安装步骤、编程基础和高级特性,为初学者和开发者提供宝贵的资源。通过深入学习和实践,你可以掌握Cache数据库的核心技能,实现高效、稳定的应用程序开发。

    CACHE技术手册,强烈学习

    ### CACHE技术手册核心知识点概述 #### 一、CACHE技术概览 - **CACHE技术**:CACHE是一种高性能的数据管理平台,由InterSystems...无论是对于初学者还是经验丰富的开发者来说,掌握CACHE的相关知识都是非常有价值的。

    cache数据库面向对象软件开发教程

    cache数据库面向对象软件开发教程 比较老版本的cache数据库的文档开发 适合初学者去了解cache的基本概念 本

    Cache实验成果

    8. **参考价值**:虽然这个实验的功能可能相对简单,但它提供了一个基础的平台,有助于初学者或研究人员直观地理解Cache的工作原理,也可以作为进一步复杂Cache模拟和分析的基础。 9. **文件下载**:提供的"Cache...

    springcache+redis springboot maven

    在IT行业中,Spring Cache是一个非常流行的缓存抽象层,它允许开发者通过简单的注解来实现应用的缓存功能。Spring Boot则是一个...对于初学者来说,这是一个很好的学习示例,可以帮助他们理解这些技术的整合和使用。

    Memory Systems - Cache, DRAM, Disk

    3. 专家和新手均适合阅读:尽管内容详尽,但书籍的组织方式使得即使是计算机设计领域的初学者也能阅读理解。 4. 成为计算机设计领域的权威参考:书籍被视为专家设计师的决定性参考资料,由内存层次结构的全面覆盖和...

    cachecloud-bin-1.2.tar.gz 二进制一键安装包,官方版

    **正文** 《CacheCloud二进制一键安装包详解与Redis集群搭建指南》 CacheCloud是搜狐公司开源的一款基于Docker的分布式缓存...无论是初学者还是经验丰富的IT从业者,都能从中受益,实现高效、稳定的缓存服务管理。

    Cache基础培训

    cache数据库的安装 以及基础知识的培训,适用于初学者

    解决mycatJDBC8驱动连接Mycat1.6报错 Unknown system variable 'query_cache_size'

    对于初学者,建议使用SSH工具如PuTTY远程连接到服务器,然后执行相关命令。 至于提供的压缩包文件"mycat",可能是Mycat的源码或二进制包。如果是源码,你需要有编译环境和相关工具来编译和修改;如果是二进制包,...

    ESB和Cache入门学习

    提供的压缩文件包含了多个练习文档和PPT,覆盖了Caché的开发介绍、架构、类、属性等内容,适合初学者逐步深入理解Caché。例如: - `01概述.pptx`:讲解Caché的基本概念和应用场景。 - `02开发介绍.pptx`:介绍...

    keycloak-invalidation-cache-model-1.7.0.CR1.zip

    对于初学者,这是深入了解Java编程和身份管理服务的宝贵资源;对于高级开发者,这提供了定制和优化解决方案的机会。 总的来说,`keycloak-invalidation-cache-model-1.7.0.CR1.zip`这个压缩包包含了一个关键的...

    自定义的cache

    【自定义的Cache】 在计算机科学中,Cache(缓存)是一种存储技术,用于提高数据访问速度。...通过学习和实践,初学者可以更好地理解Cache的工作机制,并将其应用到实际项目中,实现更高效的数据访问和处理。

    Cache 数据库相关----脚本MUMPS语言

    ### Cache 数据库相关----脚本MUMPS语言 #### MUMPS语言概览 MUMPS(Massachusetts Universal Multi Programming System)是一种专为...无论是对于初学者还是有经验的开发者来说,掌握MUMPS都将是一项宝贵的技能。

    前端开源库-snapy-cache

    在前端开发中,高效的数据管理和缓存策略是提升应用性能的关键。`snapy-cache`是一个专为前端设计的...无论你是初学者还是经验丰富的开发者,都可以考虑将`snapy-cache`纳入你的工具箱,以应对各种前端数据缓存挑战。

    wp-super-cache.1.4.4

    简单模式适合初学者,而更复杂的模式则适用于需要更精细控制的专业用户。 5. **动态更新**:尽管wp-super-cache创建的是静态页面,但它仍能处理动态内容的更新。当博客文章、评论或其他动态元素发生变化时,插件会...

    初学cpu设计(完全教程)

    8. 存储层次结构:CPU与内存之间的交互是通过高速缓存(Cache)进行优化的。理解缓存的工作原理、替换策略和多级缓存结构对于设计高性能CPU至关重要。 9. 总线与接口:CPU通过总线与其他组件如内存、I/O设备进行...

Global site tag (gtag.js) - Google Analytics