Spring 3.1 终于加入了Cache支持

Cache一般是对数据的缓存,数据库思维情形下,认为Cache只要和数据库在一起就可以,因此,过去Spring版本是没有缓存支持,因为他们认为Hibernate或JPA等ORM二级缓存支持就可以了。

是不是缓存只是持久层的事情呢?如果我们的架构中没有持久层只有模型层,或者持久层被下放到模型层的一个内部实现机制而已。

就象我们在电脑里面打字,我们面对的是编辑器中的“字”,而这些“字”实际就是在内存中“字”,我们按“保存”键就是将内存“字”持久化保存到硬盘上,这个动作如果软件能够自动做,那我们就不必做,实际上,现在很多NoSQL产品都是内存数据库,内含自动持久化内部实现机制而已。

如果我们的架构是以模型驱动开发为主,也就是DDD设计为主,而不是以关系数据库操作为主,那么,模型就只能存在内存中,而对模型的操作很显然应该是业务层框架必须做的事情。(JdonFramework从第一个版本就认识到这个问题,加入Cache支持)

所以,在一个MDD/DDD架构中,模型层是核心,模型中有实体 值对象和服务。这些都必须是业务层框架进行支持,目前比较好的是DCI框架来支持。

我们回过头来再看看Spring 3.1的cache支持是怎样的?它导入一般的缓存机制,可以缓存任何Java类 方法或库包,也可以和现有缓存机制比如ehcache或hazelcast支持,用以提高性能。

从它的发布说明书来看,Cache目前只用来提升性能用,还没有上升到对领域模型的支持高度来。Spring让我们要等待你多久才能引导大众走向模型驱动开发呢?抑或MDD/DDD真的太先进,太冒进?还是你的步伐太落后了呢?


Spring 3.1 M1: Cache Abstraction | SpringSource Team Blog

[该贴被banq于2011-02-24 10:50修改过]

什么时候能够等到你对DDD模型的支持呢?我有时觉得如此在原地等待你是不是一种冒进后的迷茫?

做过桌面软件的程序员,都会知道:内存才是软件活动的地方。摆脱不了数据库,性能会被硬盘到内存的性能所绑定,也就是瓶颈所在。用Java,第一件app通常是Web app,而不是Desktop app,所以会被所谓的“前辈”所误导。

其实就是类似一个实验:“把文本的信息进行格式处理”,这个实验比起Web app更多的是Desktop app。初学的人,很容易就直接在文本上读一个处理一个,而不是想到,全部加载到内存快速处理。其实只要理解Cache的真正意义,就了解到web app的性能并不是在数据库读写上,而是在我们的设计上。

其实不懂的人可以做一个实验:做一个没有数据库,只有cache的web app。(数据库思维的程序员千万别觉得不可理喻,做过才知道呢)

我就觉得DDD确实有些先进了。或者说,用DDD去设计公司的业务,很多人都不会。。。。

cache本来就是用于提高性能的,而不是用于永久保存数据的。
楼上2位大师今天似乎有点失言了。

2011年03月02日 22:43 "jackhatedance"的内容
cache本来就是用于提高性能的,而不是用于永久保存数据的。 ...

咋一看,cache确实是用于提高性能的,但从另外一个方面想,它是用于管理软件中对象的生命周期的,从软件的角度看,cache是提供了系统内存接口,同时管理我们的对象。从没到有,是提高性能,但内存存在了多少年了?很多框架、web应用却没有去用到,所以已经不是提高性能的问题了,而是软件本来面貌的问题了。回想一下,内存是因为什么而诞生的。而cache的出现,使我们重新从数据库回到缓存。

做过桌面程序的,都知道可以用集合来缓存经常使用的对象,类似Map,但Map是不包括生命周期管理的,所以内存占用只会越来越多,所以cache就非常适合了,从这点来看,cache就是拥有对象管理的Map。这点思维非常重要,也就是打破传统数据库思维的关键。

感觉这个评论有点扯了。。。。
cache,本来就是为了提高性能啊?还有别的意义吗?和DDD有啥直接关系啊?
DDD中有模型,所以,为了性能,需要对模型缓存。
面向DB开发中,DB映射类是主要的,为了性能,所以需要缓存 DB 映射类的对象。

不都是为了性能么!扯什么理论有什么意思。

至于楼上有个哥们说“内存是因为什么而诞生的”,可以告诉你,现代计算机体系是基于冯诺伊曼的理论构建的
内存式计算机,从1945开始,到现在就没变过,如果你能改变这个体系,会成为一代伟人。

真的,这篇文章感觉就是扯的感觉。

扯什么理论?你一口“扯”字,真让人不舒服呢,呵呵。

cache引入是除了是性能提高外,还有就是思维的改变。

“cache本来就是用于提高性能的,而不是用于永久保存数据的”我本来就没有说过要用cache永久保存数据,cache是纯内存的,可来永久呢?但cache肯定有saveToDisk,loadToDisk的接口。你可以自己用序列化保存文本实现,或者用数据库实现,甚至cache本身就带有这样的功能(如ehcache)。从这里可以看出,框架引入cache后,整个思考设计已经不是对数据库的思考了(没有所谓的字段和存储过程等,只是对象的放入拿出——黑盒思维),而是对对象(领域模型)的思考。引起这样的改变是因为提高了性能?我以前的帖子就说过,若果内存足够大,而且不死机,就map也可以实现同样效果,思维一样可以转变。别忽视了思维转变这一点!!!

“现代计算机体系是基于冯诺伊曼的理论构建的内存式计算机,从1945开始,到现在就没变过,如果你能改变这个体系,会成为一代伟人”不知道后半句你为什么会这么想,关于前面的说法,我既然问你内存的诞生意义,当然是问有无之间的区别,好像在你眼中就只有内存式计算机一样。关键词是“预存”,内存跟缓存一样是“预存”,没有内存,人们考虑的是插线,没有缓存时,人们考虑的是数据库。

“缓存”是指“缓冲储存”,是一个中间存储件,跟内存一样。至于LRU算法这些,是作为缓存的增值,“选择什么东西被放到缓存”的意思是“我们想缓存我们想用的东西”,通过LRU,则可以实现“想用的东西”=“常用的东西”。缓存后,性能提高不是指因为命中率提高,而是速度差之间得到缓冲,LRU缓存只是一种特殊缓存,有的硬件只把缓存作为缓冲区。而内存只是一个大缓存而已,Cache提高了性能,是因为它预存了东西,说白了要是目的是出于预存解决速度差问题,就是连Map都是缓存。这就是我叫你回想“内存是因为什么而诞生的”的原因。

Cache只是提高性能?增值的存在,使我不这么觉得,呵呵。


[该贴被SpeedVan于2011-03-06 03:14修改过]
[该贴被SpeedVan于2011-03-06 03:17修改过]

很抱歉,看到借着点东西就扯上很高很深理论的东西,我就喜欢直接说明白,不喜欢含蓄。

照你这么说,如果没有cache,是不是就没有 DDD 了,就没有面向对象的思维了,就全是面向DB的思维了?

cache就是提高性能的手段,不管你用什么思想也想,什么理论也好,用cache就是为了提高性能。而不是说cache带来了你的思想的革命。cache只是手段和方法,不是你思想转变的根基。

要不,你从 DDD 这本书里看看,哪个地方说 cache 是 DDD 不可或缺的一部分?

至于 banq 说 jdon 从一开始就引入cache,就比 spring 高明了,我真的没法认同。

不是的,主要就是让模型活起来,哪怕你用Map也可以,放到数据库的是数据,而不是实体,每次都要让实体死了又生,生了又死,舒服?“业务框架,支持模型的操作”,这句话,我是赞同的。Spring的话,用什么来存放他的实体呢?不用Cache,用Map也可以,前提要自己管理好实体。而怎么样把这些实体状态持久化,则是技术的事情。我说的脱离数据库思维就是这样,其实就是仓储思维的一部分。让业务设计人员得到一个仓储,在他们看来,仓储就如Map一个放进去,拿出来的东西,若果用DB思维,则需要转化思维,把数据重新再组成实体。对于DDD来说最小单元就是实体,值对象这些,但永远不是数据。你不可能说数据库存的就是实体吧,那么用什么保存实体呢?

其实简单说就是,数据库中是数据,实体永远是在内存领域中,不可能在其他地方。(当然也可以说成数据库中是沉睡着的实体)

>>“如果没有cache,是不是就没有 DDD 了,就没有面向对象的思维了,就全是面向DB的思维了”

请注意不要歪曲意思,思维的存在,与思维的落实是两回事。我的意思是说,按照现在软硬件的支持,要把DDD落实到代码上,cache可以说是必不可少的,而且最好是一种可以管理实体关系的cache,否则这样的cache只是性能而已,而实体关系管理的代码则需要自己写。在我现在的认识看来,cache是否上升到支持DDD,关键是是否支持实体管理,至于是否还有其他,则还需要探索学习。

在你看来cache只是性能,是因为没有上升到DDD,泛型的cache当然是性能了,但cache在一种设计下面,也同时扮演一种身份。可以说用这条公式“cache+实体管理=DDDcache”来表示,类似“cache+LRU=LRUcache”。其实有点像JBossCache的,但还是不够,个人感觉一个组装+JBossCache就差不多了。然后仓储就管理着这样的cache和其他数据库。所以说cache存在增值,不单单是性能。其实你的观点就是cache就是解决数据传输处理的速度差问题,没有什么增值。而我刚好相反。

cache是解决性能是没错的,说的是缓冲的意思,但这句话并没有包含缓冲什么,LRU缓冲常用的数据,DDD缓冲的是实体,可能还是常用的实体(因为这些是存在关系的,所以需要管理),所以有“cache上升到XXX”一说。其实就是加一个定语而已。一般的cache只是数据缓冲,但这里需要缓冲的是一种特殊概念的对象,所以最好有一个特殊的cache。数据可以上升到对象,那么对象为何不可以上升到实体呢?
[该贴被SpeedVan于2011-03-08 05:18修改过]

Spring的定位并非是DDD框架。
DDD 中能不能不用cache?答案当然是肯定的。为什么用cache?当然是为了存取对象的性能的提高

对吧,所以有的时候没必要搞那么复杂,又是这个,又是那个的。

DDD 的本质其实就是面向对象设计的升华。其实大伙也不必把面向数据库的开发和DDD弄得那么对立,两者其实没那么对立。其实很多场合,关键不是你怎么写代码,更关键的是你怎么去理解和设计整个系统,唉,跑题了。

何为复杂,无人能说清楚。DDD从对象上升实体,值对象等概念,复杂了?别把一个上升过程当作复杂。数据缓存,对象缓存,实体缓存,同理而已。越接近现实,越感受到逻辑的复杂。

好了,这个话题有点到象数关系上了,结束这个话题吧。

PS:数据库思维与DDD思维的区别,以前的帖子已经说过不少了,数据库思维是增删改查,DDD考虑的是实体存亡与运动,好了不想再多说了,每个人都有自己的信仰,也不必强求同一了。
[该贴被SpeedVan于2011-03-09 19:37修改过]

Cache就是为了永久保存对象用的,只不过目前还不够大,之所以叫“Cache”是因为刚开始内存总是很小很贵。就目前来看我觉得Cache是为了永久保存一些数据。

不懂就不要装
cache你从字面理解就应该知道是干嘛用的。
cache里面保存什么样子的东西跟cache有关么?
难道必须要区分数据cache和对象cache?两者有什么不同?
从计算机诞生到现在,CPU的指令还没有发生本质变化,也就是是选址和读数据的方式还是一样的。
小孩子慢慢学,不要学到点什么就出来充专家。