五千年(敝帚自珍)

主题:【原创】wikipedia架构学习笔记(一)他们的骄傲 -- 羽羊

共:💬62 🌺262
全看分页树展 · 主题 跟帖
家园 【原创】cache,没比有好,少比多好(上)

现在,memcached几乎成了网站标配的东西,无论什么网站,一旦性能出了问题,首先想的几乎都是“我是不是要上个memcached?”

现在玩儿php的多,flickr,wikipedia都是基于php的,咱们就拿php说事儿,这种cache偏执症,小羊接触过十个用php的其中就有八个,而且这八个当中还真没有多少实际在项目当中用过cache,反倒是玩儿java或者python,ruby这些动态语言的哥们儿,cache对于他们几乎就是常态,用的多了,倒对于cache有不同的看法,那就是——没比有好,少比多好。

先前有朋友的回帖中,已经看出了性能报告显示的问题,我们延展开来先吹吹cache的冷风。

关于memcached,有两个通常的误解,第一,应用cache是很方便的,第二,无论怎么说,cache总是比数据库要快,我们就从这两个方面说起。

一、memcached不是数据库,它和数据库在使用上的区别就好像BASIC的文件操作和C语言的指针,memcached实际上是一个大的内存hash,所有的读写都是在操作key=>value对,换句话说,需要得到一个value,必须明确知道其对应的key,一个习惯了select,insert,update,delete的程序员在第一眼面对memcached的时候都会非常不适应。毫无疑问,应用memcached会带来代码层面的改动,所以,混乱的代码和对于应用memcached不充分的前期准备都会使这项改动代码的工作成为噩梦。就算是在访问层面跨过了这一关,后头还有一个缓存和数据库同步的问题在等着你,“脏数据”,这个通常被RDBMS处理掉的问题,现在需要程序员自己操作了。

另外,小羊接触的很多对memcached满怀憧憬的哥们儿都有一个普遍的误解,那就是几乎所有memcached介绍文章都会提到的的“分布式”,好像这下子程序可以无限制的水平扩展下去了,实际上,memcached本身恰恰是不具备分布式能力的,甚至多个memcached多个节点之间无通讯还是它的一个卖点。所谓分布,是由memcached的接口函数实现的,多了这么一个接口程序,又是一个复杂度的上升,而且还有函数库本身效率出现问题的风险。

二、应用cache一定很快么?先考虑读取数据的问题,对于简单的查询,memcached的操作速度通常和经过良好优化的数据库一样快,select a from b where x=y 的操作数据库花不了1ms的时间,memcached也快不到哪儿去。如果碰到缓存没有命中,那么仍然需要访问数据库,说不定还要把访问结果写入缓存,那么花费的代价则是数据库的至少两倍。

假设缓存总是命中,那么从速度上面看,查询越是复杂,memcached的优势越大,因为我们会在memcached中仅仅存放查询结果,而数据库则要稀里哗啦把N个表折腾一下。但是慢着,我们好像在讨论复杂查询结果放入缓存的问题,那么首先看看所谓的“复杂查询”,如果需要把一个“复杂查询”的结果放入缓存,那么意味着这个复杂查询的访问频率相当的高,否则我们只能得到低下的“缓存命中率”了,考虑到应用memcached带来的代码、架构以及维护的复杂度上升,低下的“缓存命中率”几乎等于得不偿失。如果缓存命中率很高,您的应用需要频繁的使用这么复杂的查询,那么也许首先要做的不是考虑memcached,而是检讨一下整个系统包括数据库结构的设计了。假如在信息版回帖,西西河的程序需要先要动用一个关联N张表的复杂查询,判断一下经验、声望、乐善、是否认证...这样...绝大多数不明真相的河友面对一页页500错误一定义愤填膺,那样会让GFW蒙受不白之冤,亲者痛仇者快阿~~最重要的是:如果这样的代码是小羊写的,那么老铁一定不给工钱,小羊只好过年的时候去爬脚手架了。

除了读数据,还有写数据的问题,通常,为解决缓存和数据库同步问题,可以有两种方法,第一种是从数据库读出数据后,写入缓存,以后直接读缓存,这是一个常见的说法,长野雅广、前坂徹在广为传播的《memcachedを知り尽くす》一文中开篇说的就是它。第二种方法是在写数据的时候同时写入缓存,读的时候直接读缓存。无论哪种方法,如果数据经常被访问,那么我们两次的辛苦也就罢了,如果访问率很低。。。嘿嘿,反正内存便宜,希望大家都可以不用关注成本问题而且收入和代码行数挂钩。

罗罗嗦嗦说了这么多,memcached还真是麻烦阿。没错,这就是开篇所说的——在性能没有问题的情况下,cache,没比有好,少比多好。

如果读到这儿,您认为memcached能存在到今天都是错误的话,那么,小羊首先要道歉,这不是小羊的本意。memcachd其实真的是好东西,只不过,使用的难度很大,也很考程序员和架构师的功力,明确了这一点,在回头看看wikipedia,才会理解wikipeida在使用memcached上的精要之处。

喝水

元宝推荐:铁手,
全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河