不用第三方缓存框架的缓存超时清除问题

现有设计:
两层HashMap结构
ClientKey---(CacheKey---XCache)

每次取缓存的时候通过ClientKey和CacheKey找到对应的XCache对象。

现在的设计是另外起一个轮询线程,为每个Client设置一个ClientActiveTime,为每个XCache设置一个CacheActiveTime。每隔一段时间检查当前时间减去ActiveTime是否大于超时时间,当然在扫描过程中是对这两层结构加锁的。

如果Client超时,则所有的XCache清除,或序列化保存。
如果XCache超时,则只清除当前的XCache对象,或序列化保存。

因为XCache引用的对象不小,所以当用户很多的时候会造成系统缓慢,甚至OOM,现请教高手:

1.有没有更好的设计来对XCache进行缓存?
2.这种定时轮询的方式是不是合理,有没有别的方式进行检查?
3.如果使用EHCache或者MemCache会在哪些方面带来优势(因为当前代码是可控的,用第三方的话不知道会不会带来其他问题。)

望赐教,感谢!

0

2个回答

因为XCache引用的对象不小,所以当用户很多的时候会造成系统缓慢,甚至OOM,现请教高手:
1.有没有更好的设计来对XCache进行缓存?
解决方案:
1、LRU LFU 肯定要设置缓存的大小
2、SoftReference 保证内存不足的情况垃圾回收

2.这种定时轮询的方式是不是合理,有没有别的方式进行检查?
大家都是定时轮询

3.如果使用EHCache或者MemCache会在哪些方面带来优势(因为当前代码是可控的,用第三方的话不知道会不会带来其他问题。)
框架的好处就是给你现成的更优良的解决方案,这样直接拿着用即可

用第三方的话不知道会不会带来其他问题:现在如ehcache都比较稳定了,没什么问题,因为开源如果需要看下源代码即可

0

[quote]
1.有没有更好的设计来对XCache进行缓存?
[/quote]
感觉这个设计可以,在数据量不大的时候可以这么做。如果数据量太大,就会导致内存不够用了。
[quote]
2.这种定时轮询的方式是不是合理,有没有别的方式进行检查?
[/quote]
其实还是一个问题,数据量大的话就会有问题,当然,也可以考虑类似memcached的管理模式:不轮询,只是等使用对象时在判断对象是否过期,如果不过期就返回,如果过期就删除。这样会造成内存浪费,如果数据量小的话可以考虑。还可以考虑两种方法的结合,这样轮询的频率就可以降低一些,比如一天一次,在凌晨没有什么用户的时候进行。
[quote]3.如果使用EHCache或者MemCache会在哪些方面带来优势(因为当前代码是可控的,用第三方的话不知道会不会带来其他问题。)
[/quote]
使用外部缓存,可以带来很多好处,比如不用考虑内存管理,可以使用分布式缓存等等,至于稳定性应该不用担心,这些都是比较成熟的东西了。如果要用的话,当然需要研究一下了。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!