`
阅读更多
  初次学习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需要。

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

相关推荐

    MMU与CACHE详解

    MMU与CACHE详解适用于初学者理解CPU MMU, CACHE

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

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

    Cache基础培训

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

    嵌入式编程中的CaChe机制及其原理

    对于初学嵌入式的新手来说,不明白CaChe的工作原理,可能会很迷茫,本文将全面揭示嵌入式中CaChe的原理。

    如何用C语言操作arp cache

    arp cache中存放着局域网内IP地址和MAC地址的对应关系,对socket通信是至关重要的,arp cache由Linux内核进行维护,本文介绍如何用ioctl获取arp cache记录,添加新记录到arp cache中,删除arp cache中记录,每一种...

    自定义的cache

    本软件可以帮助初学者了解cache,以及高效充分的使用.

    网络安全方面的资料,+适合网络安全的初学者

    cache.tmp (114688, 2020-01-10) CCC (0, 2019-09-15) CCC\aspRwWithJMail.ccc (668, 2011-06-28) CCC\aspSpy.ccc (6132, 2011-06-29) CCC\aspx.ccc (564, 2011-06-28) CCC\php.ccc (262, 2011-06-28) Customize (0,...

    MySQL高速缓存启动方法及参数详解(query_cache_size)

    会发现其变量have_query_cache的值是yes,MYSQL初学者很容易以为这个参数为YES就代表开启了查询缓存,实际上是不对的,该参数表示当前版本的MYSQL是否支持Query Cache,实际上是否开启查询缓存是看另外一个参数的值:...

    网络安全说明:网络安全方面的资料,+适合网络安全的初学者

    cache.tmp (114688, 2020-01-10) CCC (0, 2019-09-15) CCC\aspRwWithJMail.ccc (668, 2011-06-28) CCC\aspSpy.ccc (6132, 2011-06-29) CCC\aspx.ccc (564, 2011-06-28) CCC\php.ccc (262, 2011-06-28) Customize (0,...

    oracle初学者必知的100个问题

    oracle初学者必知的100个问题,1. Oracle安装 2. ORACLE9IAS WEB CACHE的初始默认用户和密码

    淘宝数据抓取 初学者适用

    request.Headers[HttpRequestHeader.CacheControl] = "no-cache"; using (var stream = GetResponseStream(request)) { using (var newStream = new StreamReader(stream, Encoding.GetEncoding("GBK"))) { ...

    pandas_cache-0.0.1.tar.gz

    这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,...

    初学android用的一些源码

    主要是一些android基础代码,第一次学android,由于其他原因需要暂时放一下android,所以...主要是用于访问android中的文件空间使用情况和所有应用程序占用的空间大小(code、data、cache),listview的简单绑定使用。

    pandas_cache-0.0.1-py3-none-any.whl

    这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,...

    WebCache:Chrome扩展程序,用于查看当前网页的缓存版本

    安装WebCache 版本v4.0.1 反馈 请报告任何损坏的功能或功能要求。 如果您想对Chrome扩展程序进行评分,请在。 贡献 我明确欢迎那些从未为开源做出过贡献的人们的贡献:我们曾经都是初学者! 我可以帮助建立部分...

    Cache

    在虎钳的空白处进行初学者操作,在任何时候都不能使用,请在浏览器处进行操作。她的复习生西德恩·斯特伦根·布利斯特·维斯特(anset hvor mange gange man) Strengen er nu nu gemt i Cachen。 Det sammegælder...

    mysql优化的重要参数 key_buffer_size table_cache

    MySQL服务器端的参数有很多,但是对于大多数初学者来说,众多的参数往往使得我们不知所措,但是哪些参数是需要我们调整的,哪些对服务器的性能影响最大呢?对于使用Myisam存储引擎来说,主要有key_buffer_size和...

    VB获取IE Cache,缓存文件目录路径

    内容索引:VB源码,系统相关,缓存目录,路径 VB获取IE Cache,也就是大家常说的IE缓存文件的目录路径,程序较简单,除了获取缓存目录的功能外,没有其它功能,帮助VB初学者了解VB与Windows各目录的获取方法,这是其中...

    IBM主机和存储设备基础

    很详细的介绍了IBM主机和存储设备基础,有利于想了解IBM产品的初学者学习。

    deno_handbook:Deno入门指南,入门教程,初学者教程

    长期更新,面向新人的Deno入门指南,入门教程,初学者教程。 前言 本教程采用的v1.3.3版本为v1.3.3 ,std模块版本为v0.68.0 。 本教程的目的是为JavaScript / TypeScript开发者提供一个Deno入门指南,虽然Deno是使用...

Global site tag (gtag.js) - Google Analytics