读书人

初试ehcache2.4中新加入的搜寻api(sea

发布时间: 2012-08-26 16:48:05 作者: rapoo

初试ehcache2.4中新加入的搜索api(search api,EQL)
阅读本文的时候最好是能基本掌握ehcache的配置、使用(包括分布式的配置),对于基础的配置过程、概念就不一一详细描述了
从ehcache2.4版本开始支持搜索api,可以从键(key)和值(value)中按照任意复杂的逻辑条件得到需要的查询结果(通过EQL),想想平时在缓存的value中查找自己需要的结果我用的是最笨的for循环,有了EQL,简直太棒了。单机和分布式缓存的都可以用(Terracotta貌似收费项目中不敢冒然使用),官方配置文档可以看出非常之仓促ehcache.xml都写成了ehcachel.xml,官网上的示例代码也无法下载。
jar包不需要再多添加了2.4的那个900多K的jar中已经包含了新的类,诸如:Results,Query等

很庆幸,分布式缓存是可以正常工作的,只要添加一个【<searchable />】节点就可以了:
<cache name="UserCache" maxElementsInMemory="100000" eternal="true"
overflowToDisk="false">
<cacheEventListenerFactory
/>
<searchable />
</cache>

测试中遇到的一些问题及其解决方法:
1.Query is frozen and cannot be mutated
解决:createQuery()....end(); 去掉 end();

2.No results specified. Please specify one or more of includeKeys(), includeValues(), includeAggregator() or includeAttribute()
解决:
query = obj.createQuery();
query.includeKeys();
query.addCriteria(Query.KEY.eq(sCacheId));
query.maxResults(1000);
results = query.execute();

3.isSearchable()为false
解决:配置后重启服务器,总之我就是这么解决的,分布式缓存中也可正常使用。

基本上测试代码就可以运行了,当然我们放入cache的value往往不是简单的值,而是一个pojo(dto,vo),这个官方文档也有详细介绍,配置attribute,并且稍作编码即可。

如果想对查询内容做一些计数(Average,Count,Max,Min,Sum),可以参考
http://ehcache.org/xref/net/sf/ehcache/search/aggregator/package-frame.html

官方测试1万条的结果有:62ms,125ms,180ms,貌似目前项目中够用了,他建议查询要少于100万

用到的junit示例:


出于谨慎对于新出来的功能,不敢立刻用于目前的项目中,仅仅是测试一下,知道有EQL这么回事情,待有对技术激进一点的高手在项目中实际用过了后再跟进也不迟。
官方文档链接:
http://www.ehcache.org/documentation/search.html

读书人网 >软件架构设计

热点推荐