zhuweisky

君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。
ESFramework,基于.NET的通信框架。DataRabbit,轻量的数据访问框架。DCFramework,基于.NET的动态分布式计算框架。sky.zhuwei@163.com

统计

留言簿

积分与排名

好友博客

阅读排行榜

评论排行榜

高性能的大型系统经验 -- 将数据分类、并缓存

    对大多数大型系统而言,数据库往往是最容易出现瓶颈的地方,而通过使用恰当的缓存技术可以非常有效地减轻数据库的负载。
    
    将系统中用到的所有数据进行分类,分别对待不同种类的数据而不是一视同仁,有利于正确地做出缓存哪些数据、以及如何缓存的决策。
    我通常将系统中用到的数据分为四类:恒定不变的数据,只发生增量的数据,偶尔改变的数据,经常改变的数据。
(1)对于恒定不变的数据,采用普通的恒定缓存,即这种缓存在系统启动后初始化一次就不再改变了。
(2)对于只发生增量的数据,采用智能式的增量缓存,如果所要的数据在这种缓存中不存在,则该缓存会从其它地方(如数据库)自动加载目标对象并缓存起来。
(3)对于偶尔改变的(但不是十分敏感的)数据,采用定时刷新的缓存,如每隔10分钟刷新一次。
(4)对于经常改变的数据,则又可以进一步细分:
       将数据中变动部分和非变动部分区分开来,而非变动部分又可以封装为单独的对象,从而对该“部分”对象采用上述三种方式之一进行缓存。

    如此,便可最大程度的利用缓存,从而可以有效提高系统性能,并明显减轻数据库和网络负载。

posted on 2008-06-27 20:00 zhuweisky 阅读(3671) 评论(17)  编辑 收藏 网摘 所属分类: 数据库

评论

#1楼 2008-06-27 20:27 Ants      

经常访问的且不是经常改动的缓存才合适,,不是什么都缓存吧..缓存也占用系统资源的.   回复  引用  查看    

#2楼 2008-06-27 20:33 Gray Zhang      

能不能考虑缓存同步写?对于数据的变更,采用对缓存对象进行修改,随后将缓存对象写入数据库中进行更新的方式,这样不需要缓存过期,同时也保证了同步性   回复  引用  查看    

#3楼 2008-06-27 21:04 一味      

@Gray Zhang
缓存同步写不是个好的解决办法,首先不能用于多台应用服务器的情况,其次容易造成缓存和数据库不同步的情况。
  回复  引用  查看    

#4楼 2008-06-27 21:59 van‘s      

感谢你的经验分享,我正要做一个大规模数据处理相关的项目。   回复  引用  查看    

#5楼 2008-06-27 21:59 Gray Zhang      

@一味
我理解不能用于多台应用服务器,但这可以通过memcache之类的单一服务器集中式缓存管理方案解决
但是对于缓存和数据库不同步的情况,我无法理解你是什么意思,我的方案是,当比如要UpdateUser时,先去缓存读取缓存着的那个User对象,进行更新,随后再拿这个对象的值到数据库中进行同步更新,因此此时缓存对象和数据库应当是相同的内容,是同步的
  回复  引用  查看    

#6楼 2008-06-27 22:39 萧寒      

@zhuweisky

我觉得缓存是提高性能的比较好的方式;但缓存的更新应该是需要非常高级的模式;希望博主有此高见,学习
  回复  引用  查看    

#7楼 2008-06-27 23:27 PerfectDesign      

用内存数据库吧   回复  引用  查看    

#8楼 2008-06-28 05:59 www.guyazi.com[未注册用户]

我把缓存分为这么几类:
1,数据库中定义的常量,程序代码中也经常使用,使用只读或者常量定义这些数据,例如博客的类型:public const int BlogType_PowerUser = 1;。
2,经常使用的数据,例如某个博客的个人基本信息,他的博客网页每一个页面都要显示。
3,大计算量的数据,这类数据一般实时性不强,例如统计每个页面来自那些地区的访问者数量(按照地区和兴趣)。这些数据需要二次缓存,先定时统计,把结果保存到缓

存文件或者缓存数据库,然后在使用的时候从缓存文件或者缓存数据库读入,放入内存缓存。
4,历史统计数据。这类数据可以看作是大计算量的数据,但他还有一个特点,历史数据,恒定不变。这也有两种方法,一是做一个统计表,定时把统计结果写入。我是直接

把统计结果写入缓存数据库,没有那个冗余的统计表。这样其实有个灵活性,统计方式变化了,不需要去更改那个统计表的设计。

是需要划分内存缓存和数据库(或文件)缓存的。
内存缓存那些经常使用的,小的,更新比较频繁的,执行查询效率比较高的 数据。一般我喜欢使用定时清空的策略,不容易出错。
数据库缓存那些笨重(数据量大)的,计算量大(执行SQL查询效率低)的,实时性要求不高的,历史性的 数据。

对于blog类网站来说,我觉得只需要缓存文字。图片声音这类的,直接放到硬盘。
这类网站的缓存,我甚至都觉得可以把所有请求的文字内容使用定期清除的方式缓存起来。想想1G的文字是什么概念,现在内存这么便宜。
但是需要注意的是,缓存的内容要比数据库中的数据多,其实这个很简单,缓存的内容是基于数据库“计算”得到的,是“衍生”的。


使用一个单独的缓存服务器是必要的,内存大是他的特点。多个WebServer可以连接到这个缓存服务器。这样对于整个系统的扩展和性能都是很有好处的。

使用缓存会导致系统的复杂,稍微不注意会出问题。所有我觉得每个团队使用缓存的时候要有自己的一套简单高效的使用缓存的开发模式,否则那些错误会搞死人的。

如果使用单独的缓存服务器,还会增加一个WebServer和缓存服务器之间的通讯管理。虽然这种通讯的开发方式定下来了就是千篇一律的写代码了,但实际上还是增加了开发的复杂和工作量。

  回复  引用    

#9楼 2008-06-28 06:10 www.guyazi.com[未注册用户]


补充一点,使用内存数据库并不能完全解决缓存带来的好处。缓存的数据一般和数据库中的“原生”数据是不一样的,有很多是需要计算的。缓存不仅仅只是提高读取数据的速度,更重要的获取是节约CPU,以空间换取执行速度。
  回复  引用    

#10楼 2008-06-28 07:30 金色海洋(jyk)      

数据库本身好像就有一个大大的缓存呀,SQL Server跑起来之后是很此内存的,300多M算是少的,5、6百兆是很正常的,这样的话,我们在加一个自己的缓存,是不是更咱用资源呀?   回复  引用  查看    

#11楼 2008-06-28 10:25 eee[未注册用户]

SQL Server并发数量有限,什么都扔到数据库,撑死了并发几百个请求/s
  回复  引用    

#12楼 2008-06-28 23:40 簡簡單單..      

Mark   回复  引用  查看    

#13楼 2008-06-29 07:44 jillzhang      

说起来easy,做起来光是数据分为四类:恒定不变的数据,只发生增量的数据,偶尔改变的数据,经常改变的数据估计都不是特容易。

即使分完了,如果有朝一日,状况改变了,如何相应变化也是难题
  回复  引用  查看    

#14楼 2008-06-30 11:25 ff[未注册用户]

该生成静态页的还是生成Html最快   回复  引用    

#15楼 2008-06-30 22:45 张锐      

如果是一个几十万行的数据甚至更大,将之放在缓存中岂不是很占资源,最近正是为此苦脑,不知如何取舍好   回复  引用  查看    

#16楼 2008-07-09 23:24 tigger[未注册用户]

你做过大型系统吗?电信移动的系统是你这样缓存的   回复  引用    

#17楼 2008-07-15 21:42 蛙蛙池塘      

路过   回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1231316




历史上的今天:
2006-06-27 DTS开发记录(序)

相关文章:

相关链接: