关于使用ehcache中getKeys取不到key,但直接getKey(key)可以取出对象

RyanMiao 发布于 2015/11/12 13:03
阅读 2K+
收藏 0

@JFinal 你好,想跟你请教个问题:

测试配置:设置闲置10s后过期


<cache name="token"
           maxEntriesLocalHeap="5000"
           eternal="false"
           overflowToDisk="true"
           timeToIdleSeconds="10"
           timeToLiveSeconds="1000"
           diskPersistent="true"
           diskExpiryThreadIntervalSeconds="1"
           memoryStoreEvictionPolicy="LFU"
            />



登陆的时候,将token放入缓存中,下次请求则在缓存中取token来验证。登陆放入token代码这里不写了,就是CacheKit.put("token", id, token);.关键在于取出的时候:



int uid = inv.getController().getParaToInt("uid",0);
		Object object = CacheKit.get("token", uid);
		if(object!=null){
			System.out.println(uid+"为:"+object.toString());
			inv.invoke();
		}else{
			System.out.println(uid+"已过期");
			inv.getController().renderJson(-1);
		}
		
		List keys = CacheKit.getKeys("token");
		System.out.println("keys大小:"+keys.size());
		for (Object object2 : keys) {
			System.out.println(object2.toString());
		}

控制台在打印object的时候可以打出token值,但下面的keys集合10s后就是空的。然而,因为持续访问刷新,uid=11的token并没有达到闲置时间,所以object可以取出对象,但keys集合在创建10s后就会变成空的。

不知道我表达清楚了没有。再赘述下流程。uid=11用户登陆,token放入cache;访问其他方法,拦截的时候打印token值,最开始创建的10s内:通过CacheKit.get("token",11)可以取出token,keys也可以打印出11.在这10s内,我一直刷新访问,每次都可以打印出来。10s后,CacheKit.get("token",11)可以取出token,但keys里没有11.

就是ehcache查询缓存数量不应该是getkeys吗,但这样的结果为0,实际上却有对象在缓存。我如何得到缓存中对象的个数?

10s后控制台的输出:

11为:Token [signature=e93e39f6b44ad12b8dec8349da73f237, timestamp=1447303373541]
keys大小:0



以下是问题补充:

@RyanMiao:10s后的控制台输出: 11为:Token [signature=e93e39f6b44ad12b8dec8349da73f237, timestamp=1447303373541] keys大小:0 (2015/11/12 13:07)
加载中
0
JFinal
JFinal
    有可能是 ehcache 有 bug ,将 diskExpiryThreadIntervalSeconds 这个配置去掉,或者配置成 120 试试。最后注意一下 cacheName、key 的大小写与空格问题。
0
RyanMiao
RyanMiao

引用来自“JFinal”的评论

    有可能是 ehcache 有 bug ,将 diskExpiryThreadIntervalSeconds 这个配置去掉,或者配置成 120 试试。最后注意一下 cacheName、key 的大小写与空格问题。
这个清除磁盘中失效对象的间隔,去掉后.重新测试,120s后仍旧keys取不到key但getKey(key)可以取到对象。也就是说过期对象被清理了。快疯了,不知道原因错在哪里。ehcache版本:2.5.2
0
JFinal
JFinal

引用来自“JFinal”的评论

    有可能是 ehcache 有 bug ,将 diskExpiryThreadIntervalSeconds 这个配置去掉,或者配置成 120 试试。最后注意一下 cacheName、key 的大小写与空格问题。

引用来自“ilikesss”的评论

这个清除磁盘中失效对象的间隔,去掉后.重新测试,120s后仍旧keys取不到key但getKey(key)可以取到对象。也就是说过期对象被清理了。快疯了,不知道原因错在哪里。ehcache版本:2.5.2

很可能是 ehcache 自身的 bug,升级到 2.6.2 :

<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache-core</artifactId>
  <version>2.6.6</version>
  <scope>provided</scope>
</dependency>


JFinal
JFinal
回复 @沙驮 : 比较奇怪的问题,就是一个简单的方法调用而已,要是找到原因希望回来回分享下
沙驮
沙驮
回复 @JFinal : jdk1.8下,敲代码时没事,只要处理了那个异常就能调你说的那个方法;但运行时一直报类转型错,说某对象不能转TemplateModel;切成1.6,1.7正常
JFinal
JFinal
回复 @沙驮 : 有啥问题? 如果第二个参数不是 TemplateModel,就会调用 setSharedVariable(String name, Object obj) 这个方法,setSharedVariable 有多个重载方法,会根据你的参数类型自动选择
沙驮
沙驮
@JFinal 大师,问个问题,jdk1.8 FreeMarkerRender.getConfiguration().setSharedVariable 为啥有问题,一直调用的这个public void setSharedVariable(String name, TemplateModel tm)
JFinal
JFinal
回复 @ilikesss : @红薯 jfinal 为OSC争取来了 CSDN用户,神马开源内裤,开源马克杯都没给我寄呢?哈哈!! 也非常感谢你的支持,jfinal 的 bug 是极少的,所以关于你提出的这个问题,我很有信心是ehcache的bug,再次感谢!
下一页
返回顶部
顶部