关于jive的缓冲一些问题请教

前两天看了bangq老师的Jive论坛系统的分析,关于里边的缓冲,有一些不明:

在网上看到帖子,说缓存在不同层面上的,可以分为:
1、对象缓存
2、查询缓存
3、片断缓存
4、Action缓存

我看了Jive的分析,似乎是使用的是对象缓冲。

以Jive为例,论坛显示帖子,总是列出最新回复的主题,假如当有10个用户查看论坛时,Jive是执行10次查询语句,列出最新的10个主题的id,然后再根据主题id从缓冲cache中获取主题对象吗?还是Jive中使用的是查询缓冲?

如果真是执行10次查询,为什么在查询多个最新主题id的时候,干脆一起将主题的其他字段查询出来呢?查询1个字段和一起查询其他字段的对数据库的消耗很大吗?

我看到有人说查询缓冲使用sql语句作为HashTable的key,不知各位大侠在现实中是不是这样实现呢?还是有别的实现方式?
[该贴被slandi于2009-02-23 12:49修改过]
[该贴被slandi于2009-02-23 12:50修改过]

刚刚在某一帖子中看到banq如下描述:
缓存是针对业务对象的缓存,不是数据,注意这两个概念完全不一样,如果是数据缓存,则和数据库缓存没有两样,而业务对象则来自具体业务分析,重用性高,击中率高,可大大提高性能.

不知banq老师讲的业务对象缓冲?这里的业务对象与ORM的实体对象有区别吗?

我将数据库中表映射成实体存放到缓冲中,可是使用的时候,经常是需要关联的多个对象一起使用?这些关联的对象就是banq说的业务对象嘛?如果是这样的话,这些对象又是以什么标准构成对象的呢?

说道缓冲其实核心还是离不开数据,状态、对象====其实还是通过某种数据形式进行描述的。

对于面向“业务”和“数据”的缓冲其实是在缓冲规则考量上的区别。面向数据的缓冲无外乎:fifo/lifo====,初看起来是一个良好的方式。但是在一个具体的业务过程中这样方式其实是很低效的,关键的因素是这样的方式没有与特定的业务过程结合。

落实到论坛系统我们可以考量一下用户信息部分的缓冲。
面向数据的方式:将所有查询过的信息以ORM的方式在一个池中进行缓冲,如LZ前面所述。
面向业务的方式:在每一个登陆用户的session中存放相关检索过的数据。
显然使用第二种方式下首先系统中不会缓冲垃圾数据;其次除非系统资源不足否则不会有重复的读取操作;第三施加适当的保存策略则可以大量的减少数据持久化的写入开销(因为直接在缓冲里更新了)。
如果使用面向数据的方式获得同等的效果则需在各个方面增加相当大的开销,而且很多时候都是无法实现的。

首先感谢楼上的答复。真是不好意思,在1楼的时候把banq老师的名字打错了

to IceQi:
恕小弟愚昧,对您讲的意思没有太明白。呵呵,由于别人的优秀源码看的不太多,对缓冲这块也是刚刚接触,我想从底层了解缓存是如何实现的,不是简单的使用别人的框架。虽然感觉到面向数据方式的缓存的不足,可是我还是没有想到更好的解决方式。

“在每一个登陆用户的session中存放相关检索过的数据。”,不知你的意思是否是讲,为每个用户创建一套缓存?那如果这样的话,里边不是会有很多重复的数据吗?而且如果用户访问量很大的时候,那就如您所说不是会造成系统资源不足吗?

还是我的理解有误?

具体点讲,比如显示帖子列表这一页,如果使用面向业务的方式,具体是如何显示的呢?

在IceQi的session里面保存IceQi的:运行时刻ID,登陆时间,姓名,email地址=====
但是比不包括他正在回复的这个帖子的详细信息。

同样在这个帖子里面保存:标题,首贴内容,后面查看过的内容======
但是不包括正在回复这个帖子的IceQi的详细个人信息。

老实讲这个概念是比较抽象的,最好还是可以参考一些别人的实现。

我感觉你所说的还是面向数据方式的。或者说还是基于对象的。

不知你是否表达:session中存放有关用户(对象)、有关帖子(对象)的内容?或者就是说缓存中存放?
不知你说的业务对象在哪里呢?还是我理解错了?

还有,你可能没有明白我上面的问题,是想问,就是帖子列表页是如何显示各个帖子的?

【sorry】
真是笨,连缓存2字都打错了,实在是不好意思~~

这两天设计,发现页面上一些数据需要组织起来,他们之间存在一定的关系,但他们之间是不同对象间的数据,他们所组织起来就是业务对象吗?

呵呵,你还要再多看一些才明白我说的了

是否看一些别人的源码?
看看JdonFramework的源码?


IceQi 的意思是不是这样的?

“在IceQi的session里面保存IceQi的:运行时刻ID,登陆时间,姓名,email地址”
“同样在这个帖子里面保存:标题,首贴内容,后面查看过的内容”

就是说把缓存看成业务的(也是对象的)? 缓存里面的数据组织的像一个个对象那样存在。

现在我的理解是,对象分成业务对象、实体对象、表现对象

首先说实体对象,就像咱们说的POJO似的,里边有各个属性以及他的getter/setter方法等

业务对象是那些实体对象以及一些状态,还有相互关联的对象组成的对象?比如在hibernate中将有主外键关联的对象,那应该算是业务对象吧

表现对象,这个算是自己的想象的定义,是在页面上显示数据所构成的对象,应该算是实体对象或业务对象的一部分,或者在添加些其他一些属性或状态?

以上是我的愚见,不知正确否?

>就是说把缓存看成业务的(也是对象的)? 缓存里面的数据组织的像一个个对象那样存在。

缓存里边的数据肯定是对象,关键是如何组织这些数据使之成为业务对象,与我们所说的POJO对象有什么关系?实体对象和业务对象的关系又有什么区别,搞不清楚

我前面说了无论如何缓冲的只能是数据。

区别在于面向业务的缓冲是以业务过程为核心进行思考,主体是业务过程;面向数据的缓冲核心为淘汰算法,主体是缓冲“池”。

软件其实是基于广泛知识之上的思考是一种思考的艺术,需要借鉴多方面的知识。看其实是很好的方式,也许是看人家的程序,也许是看人家的工作方式,但核心都是要去领会正确的思考方式。
[该贴被IceQi于2009-02-28 22:29修改过]