带你走进缓存世界(6):共享缓存

回顾之前的章节,我们大致讲了下缓存的基本概念、原理、策略和常用方法。可能会有朋友会说,访问量小根本不需要缓存,徒增开发的复杂度,访问量大的话本地缓存也没意义。其实这话说的也不无道理,当然我们不能把这句话看成绝对的话,不然什么话都成废话了:),其实我们研究学习的任何技术都不会白学的,每种技术都有他的使用范畴,只是当我们面对新的层次时,需要改变,需要重新学习。我们之前讲的每篇都非常有用,本地缓存也非常有用。不过当我们面临大的数据量和访问量的考研时,就需要使用新的解决方案。今天就讲讲共享缓存那些事。

到底什么是共享缓存?为什么要用共享缓存?
新的层次就是指当我们仅仅依赖数据库和本地缓存已经无法满足我们的访问量时,我们该怎么处理?
其实问题突出在IO(Input/Output)上,就是说我们的IO能力不足了,解决办法其实很简单就是增加内存。但是,既然是增加内存为什么还谈公共缓存呢?其实这里牵扯到了一个分布式的整体部署问题。Web站点服务器一般不是IO为主的机器,而数据库服务器才是IO密集型服务器。如果我们只是在Web服务器上增加内存,虽然可以解决一时的IO紧张问题,但是Web服务一旦重启,缓存被清空,那么所有的请求都将会去数据库服务器请求,那么数据库直接就会垮掉,也就是说网站直接垮掉。这是其一,其二web服务器是CPU密集型服务器(也就是主要用于计算,包含数据的对象处理、压缩等),如果一台计算顶不住的时候或者连接数顶不住的时候,势必要增加web服务器,到时候缓存该建立在哪台服务器上呢?所以最理想的办法就是把缓存独立出来,这就是共享缓存服务器。

共享缓存和我们本地缓存的区别在哪里呢?
最大的区别就是不在一台机器上,就是不在一个进程里都不好搞,你说是不。 所以要通过网络传输获取数据,但这要比本地缓存慢了不知多少倍,因为机器之间的通信是毫秒级的,而本地内存的数据处理是纳米级的!传输完了还不算,传输的对象也不是我们直接使用的数据类型,我们还要经过反序列化成我们想要的对象再进行处理。所以,共享缓存看起来貌似坏处多多。虽然慢,但是这也是无奈之举,因为我们不可能无限制的提升一台机器的能力,而且这种提升也是昂贵的,不如多台廉价机器并行计算;况且,再不济也比通过网络访问数据库快吧:),数据库可是从磁盘扫描的啊,这个速度也是毫秒级的。

怎么开发共享缓存呢?
既然不是一台机器,那么共享缓存就牵扯到了网络通信技术,我们平时使用的通信协议就是tcp、http,而.net自带的通信框架就是WCF,还有就是WebService,你是不是有种WebService太不靠谱的感觉?Http是无状态协议,不能保持连接,每次都要重新建立打开关闭,这并不太适合我们,而采用类似数据库的连接池方式最合适(反过来想,我们开发的何尝不就是数据库?只不过是key/value的内存数据库罢了)所以选用WCF,使用TCP协议更适合我们,只是我们需要在以前的代码基础上增加网络通信和序列化、压缩等代码:),再复杂的话那就是安全、分布式支持咯。

我们需要开发共享缓存吗?
看到WCF、TCP,连接池、分布式神马的,很多同学可能都晕了- -,其实这还是有一定难度的,不过还好我们能想到的技术这个世界上90%的都已经有了,更何况是共享缓存呢。所以我们可以直接拿别人成熟的产品来使用就行了。至于如何开发,有兴趣也可去研究别人的源代码,自己有能力的话试着去开发一个.NET版本来提升自己的能力,一般也不推荐自己开发,除非有特殊的数据结构缓存,不然会带来维护上更高的成本,除非像很有实力和需求的公司。现在一些流行的软件或框架也都是自己的需求慢慢演化成通用软件的。现在比较知名的缓存服务比如Memcached、Redis,当然还有其他好多,这个大家可以自己搜索,我就不一一举例了。

posted @ 2011-11-01 21:16  君之蘭  阅读(1916)  评论(0编辑  收藏  举报