请教关于jive缓存的问题,大家来帮忙啊

03-01-13 vic
jive中的缓存机制是根据使用大小来控制是否该将一个新创建的对象加入

到内存池中的。每个需要被缓存的对象必须implements Cacheable接口,

并且实现getSize()方法返回该对象占用的内存大小,供回调时使用。

对于只是由类型(String, int, long...)组合而成的对象使用起jive的

缓存机制能够比较准确的控制内存的使用,但是对于一个业务对象是由

其他几个业务对象组合而成的情况就很难控制内存使用量了,例如:

有A,B三个类,只有A需要缓存

class A implements Cacheable {

B b = new B();

String s = "aaa";

public void getSize() {

//这里就无法精确返回A对象的大小了

return 4+s.length*2;

}

}

class B {}

这样,如果B的对象越大,那么误差越大,除非B也实现Cacheable接口,

并且在A.getSize()中调用B.getSize(),可很难确定在具体应用中业务

对象的包含层次以及数量,所以如果想精确控制,就需要将所有被用到

的业务对象都实现Cacheable,也就是很多本不需要实现cacheable的类

也被迫实现该接口,如果业务对象关系复杂,且种类繁多,那么如果想

达到精确控制,显然比较繁琐

我想,如果想比较精确的控制,对于jive这个cache实现机制,只能自己

不厌其烦的实现Cacheable,因为实现机制是根据容量来控制的,所以

getSize()方法是保证控制精确性的必要条件。

1. 如果我仍然想基于内存使用量来控制,请问有没有更好的实现机制?

2. 有没有其他非(1)的好的缓存实现思路或已成型的框架?

3. 用于优化缓存的比较好的思路?

多谢!

banq
2003-01-14 10:25
其实对象一旦建立就在内存中,没有必要缓冲啊.

jive的缓冲其实是对论坛内容进行缓冲,这些数据平时在数据库中,基本都是String类型的.

vic
2003-01-15 19:23
1。“其实对象一旦建立就在内存中,没有必要缓冲啊.”

没理解你这句话的意思。

TmpCls tmp = new TmpCls();

没错,执行完上面一句内存中是创建了一个TmpCls的实例

tmp = null;

执行完这一句,GC可能在某个时候就把上面创建的实例给回收了

2。我和jive的需求类似,都是要把常用的对象缓存起来,提高效率

但是,jive实现缓存的根本是通过实现cacheable接口的getSize()

方法来控制内存的使用量。但是如根贴里我描述的,如果业务对象

之间关系复杂,那么getSize()实现就很繁琐

所以,我是在问,对于cache实现上有没有其他什么好的思路?

hxz
2003-01-16 10:00
我想:既然你的对象已经在内存中了,为什么你还要缓冲。jive只是数据库数据的缓存!

对于对象你一定时刻把计算内存中的对象数目,并把多余的对象tmp=null的话,那你的需求就不是和jive一样了!应该是ejb容器的需求一样了,那就得看jboss!它应该是采用某种陶汰算法,把对象序列化!

banq
2003-01-16 11:13
to vic

你不必 将对象指向清空,而是将其保存在一个hashmap中,这样垃圾回收站就永远不会清除,你需要用某个对象时,根据索引到hashmap查询调用就可以。

如果在多个计算机之间共享这个对象,就可以通过多种办法共享。

你的问题是关于对象持久化的问题,请看我推荐的文章:

http://www.jdon.com:81/jive/thread.jsp?forum=121&thread=4536

vic
2003-01-16 13:36
to 楼上两位:

呵呵,可能是我的表达能力有限,让你们误会了吧 :)

我目的不是在问怎么序列化的问题,而是说缓存增加效率的问题。

比方:

用户登陆(泛指频繁的操作),如果每次提交登陆请求,都去做

数据库查询,那么效率比较低下,所以一般按照某种算法把

认为经常使用的对象保留在内存中,也就是类似与jive一样,

用个静态的HashMap来保留对象的引用,不至于对象被GC回收。

这样下次直接就可以从内从中来判断登陆了

我的问题是:

缓存对象是为了提高系统效率,但是如果缓存了大量的对象则可能

适得其反(out of memory),所以我想问什么算法能够相对保证效

率安全两不误?

jive的保障是以 getSize()为依据的,通过这个方法可以计算当前

缓存的对象占用的内存大小,从而决定是否能够继续往缓存中添加

东西。但是,getSize()的局限性,我在上面也说过了。

但是目前我考虑的实现方法是利用hashmap.size()来控制是否应该

往缓存中加对象,同样这种方法使用起来比较不安全,因为通过

个数来控制本身就有先天缺陷,根本无法计算缓存到底占用了多少

内存,即使我提供一个maxSize,那么这个值的设定也是完全凭人

的估算决定的,所以无法在程序中限制缓存使用内存量的范围。

(当然,如果根据业务量(登陆次数),业务对象大小(userName+pwd),

内存总量,是可以比较估算出一个比较安全的maxSize的)

一人的能力有限,所以我想请教的就是你们有没有更好,更可观

(也就是程序控制)的方法实现安全,效率两不误?

vic
2003-01-16 13:38
忘了说了,目前就考虑范围就先限定在

单机,单jvm的环境下;至于网络间共享,多jvm共享的问题

可以是后话 :)

hxz
2003-01-17 09:46
本身jive就说明了大小是个约值!

就我看来,你可以把要cache的那类做得单一些!因为要缓冲也就只是数据库中的数据!

vic
2003-01-21 11:29
好想也只能这么解决了

这里就跟clone的问题一样,是浅copy还是深copy的问题

就简单起见吧 :)

猜你喜欢