原文:http://blog.csdn.net/jarfield/article/details/4322953
最后更新时间 2009-04-10 更新人 dormando@rydia.net
这里收集了经常被问到的关于memcached的问题
一般的问题
什么是memcached?
memcached是一个高性能的、分布式的、内存对象缓存系统。memcached本质上是一个通用的缓存系统,但是它通常被用来减小数据库的负载,以达到加速dynamic web应用的目的。
Dange Interactive (开发memcached的组织机构,译者注)开发memcached的目的是,加快LiveJournal.com的速度。 LiveJournal.com 这个网站拥有大量的web server和database server,每天访问的用户数高达1百万,每天的动态网页PV高达2千万+。有了memcached,数据库就跟没事一样,其负载被大大减小。Memcached加快了动态网页的响应时间,提高了资源利用率,加快了memcached不命中时数据库的访问速度。
从哪获得memcached?
到这个下载页面 下载吧!
怎么安装memcached?
可以参考安装指南 ,也可以使用操作系统的软件包管理系统来自动下载安装(apt, yum等)。
如果您的linux发行版没有memcached,或者有了memcached但版本不够新,您还可以从源代码安装。从我们的下载页面获得源代码的tar包,然后在shell中执行以下命令:
$ tar -zxvf memcached-1.x.x.tar.gz
$ ./configure --enable-threads (如果您想使用多线程工作方式)
$ make
$ make test
$ sudo make install
您可以使用'./configure --help' 可以查看所有的选项。
哪些平台可以运行memcached?
任何有空闲内存的地方都可以!Memcached可以运行在linux、BSD、windows。它只需要很少的CPU时间,所以无论哪里有空闲内存,哪里就可以运行它。
什么情况下适合使用memcached?
如果您的网站包含了访问量很大的动态网页,因而数据库负载很高,而且大部分数据库请求都是读操作,那么memcached可以帮您显著地减小数据库负载。
Memcached同样适用在其他很多场合。至于到底适用哪些场合,您可以通读Memcached FAQ和相关的指南来获得一些灵感。如果您的数据库负载比较低但CPU使用率很高,您可以缓存计算好的结果( computed objects )和渲染后的模板(enderred templates)。通过memcached,您可以缓存session数据、临时数据以减少对他们的数据库写操作,缓存一些很小但是被频繁访问的文件, 缓存Web 'services'(非IBM宣扬的Web Services,译者注)或RSS feeds的结果...
即使您的资源(CPU、内存、数据库等,译者注)很充足,memcached至少也可以帮您加快页面的渲染速度。
什么情况下不适合适用memcached?
参见这里 。(下面也翻译这个页面)
Memcached的确很棒!但也不是每种场合都适用...
- 对象的大小大于1MB
- Memcached本身就不是为了处理庞大的多媒体(large media)和巨大的二进制块(streaming huge blobs)。
- 考虑其他的条件:http://www.danga.com/mogilefs
- key的长度大于250字符
- 如果真的用了这么长的key,那么您什么地方可能做错了。
- 还有,可以看看关于key长度的邮件列表。
- 您的虚拟主机不让您运行memcached
- 如果您的应用托管在低端的虚拟私有服务器(virtual private server, a slice of a machine)上,像vmware, xen这类虚拟化技术并不适合运行memcached。Memcached确实需要接管和控制大块的内存--如果memcached的内存被OS或 hypervisor交换出去,memcached的性能将大打折扣。
- 您的应用运行在不安全的环境中
- 记住,任何人仅仅通过telnet就可以访问到您的memcached。如果您的应用运行在共享的系统上,要盯紧哦!
- 您需要持久化数据,或者说您需要的应该是database
- 如果您仅仅期待memcached提供SQL接口,那么您可能需要重新思考一下对cache和memcached的理解。如果想对这个问题有更多的了解,庆参考下面dormando写的blog。
- links
- 2008/08
- Memcached versus more rdbms sharding at highscalability.com
- Should you use memcached? Should you just shard mysql more? by dormando
- 2008/08
一般来说,您的应用可以使用memcached的客户端库来访问一个或多个memcached。
这个客户端页面上列出了所有可用的API库,包括Perl, C, C#, PHP, Python, Java, Ruby, PostgreSQL的存储过程及触发器。
您可以根据memcached协议 编写自己的客户端库。
如果您想把memcached用作数据存储媒介而不是缓存,那么您应该使用database。MySQL Cluster拥有一些与memcached类似的特性(尽管MySQL Cluster安装并不容易),而且MySQL Cluster完全可以胜任一个可靠的分布存储媒介。
不!Memcached不支持也不计划支持这个操作。这个操作的速度相对缓慢且阻塞其他的操作(这里的缓慢时相比memcached其他的命令)。如前面所说,memcached是一个缓存,不是数据库。Tugela 和 memcachedb 是memcached派生出的系统,它们速度比较慢,但是行为更有点像数据库。
当然,memcached毕竟是软件,所以从某种角度说,答案最终肯定是YES。但是这个操作确实慢而且阻塞memcached。对于开发和测试服务器来说,这不是问题,但是对于99.9%的真正部署来说,答案是NO。
我们前面提到的“阻塞memcached”究竟是什么意思呢?memcached所有非调试(non-debug)命令,例如add, set, get, fulsh这些命令,无论memcached中存储了多少数据,它们的执行都只消耗常量时间。任何遍历所有item的命令执行所消耗的时间,将随着memcached中数据量的增加而增加。当其他命令因为等待(遍历所有item的命令执行完毕)而不能得到执行,阻塞就发生了。
也许您可以说,“删除我所有的key”这个命令平均只花费半秒钟,我有足够的CPU空闲时间,我隔几秒钟才执行一次这个命令,那么还有什么问题吗(还不能遍历所有的item吗)?(当然有问题)因为这半秒钟,其他的请求都至少延迟半秒钟。It'll take as long as it takes the hardware to process through that queue in order to catch up. So all of your other requests end up taking too long.
所以我们努力不做这样的事情。如果您确实需要遍历所有的item,考虑使用MySQL吧,使用主键访问数据,您还可以使用一个辅助索引加快搜索速度。