Memcached是一个提高网站响应时间的服务端软件,可以极大提高web应用在百万级访问量下的响应时间。本质上是一个基于对象的群集缓冲池。
http://www.danga.com/memcached/
web应用在访问数据库前,先尝试从Memcached中获取对象,如果未命中再实际查询数据库,并将结果放入Memcached中。
Memcached采用Server-Client结构,server是一个群集,可以随时增加和减少。
Obj = MemCache->get("KEY")
如果未找到,则从正常渠道获得对象,并调用MemCache->add("KEY", Obj)来cache这个对象
更新对象时调用MemCache->set("KEY", Obj)来更新cache
Memcached通过缓冲web应用的对象,采用hash表索引对象,并发网络连接,效率很高。
为什么不用数据库来实现?
Regardless of what database you use (MS-SQL, Oracle, Postgres, MySQL-InnoDB, etc..), there's a lot of overhead in implementing ACID properties in a RDBMS, especially when disks are involved, which means queries are going to block. For databases that aren't ACID-compliant (like MySQL-MyISAM), that overhead doesn't exist, but reading threads block on the writing threads.
Memcached缓冲的是任意对象,目前的数据库是不可能知道用户需要什么类型的对象,所以数据库所缓冲作用有限。
为什么不使用共享内存技术?(What about shared memory?)
这类技术处理多线程和多主机方面缺少优势,需要分成多个独立的cache,而Memcached通过网络形成一个完整,共享的cache。
虽然Memcached目前主要用于动态web站点,包括face book在内的许多知名站点都使用了这个工具。但我想作为一个低成本,高效率的方案,在很多方面也可以使用,比如需要大量访问数据库的网络游戏。
或者干脆作为一个对象容器来使用,毕竟Memcached具有较强的伸缩性,可以很轻易的获得几百G的内存空间。
不过作为一个cache是一定存在未命中的情况的,这就需要所有对象都必须序列化过,这样才能在未命中的时候也能正确获得对象。同时如果对象更新了,也要更新cache中的对象,这就需要应用的代码比较优化,所有读取,更新都经过一个接口。