Memcache::addServer用法+ ~+ ?) e; x+ c7 I3 }$ w7 T3 F
bool Memcache::addServer ( string $host [, int $port [, bool $persistent [, int $weight [, int $timeout [, int $retry_interval [, bool $status [, callback $failure_callback ]]]]]]] )
说明: 添加一个可供使用的服务器地址到连接池中,连接用Memcache::addServer打开,脚本执行完后自动关闭,或者可以用Memcache::close()手动关闭。相同函数是memcache_add_server()。 当用这个方法的时候(相对于Memcache::connect()和 Memcache::pconnect()方法),网络连接只有等需要的时候才会建立,因此不会因为增加很多的服务器到连接池而增加系统负担,因为很多服务器可能没有使用。2 y+ |7 V+ n& I) ] 故障恢复会发生在这个方法执行的任何阶段,只要其他的服务器是正常的,这些连接请求的失败用户不会注意到。任何一种socket或者memcached服务器级的错误可以触发故障恢复。正常的客户端错误比如增加一个存在的键值不会引发故障恢复。, x5 b. Z' y. K I# O. [
参数:( [4 ?# S3 O( `0 K $host服务器的地址 $port服务器端口3 W2 q, y6 n+ j# i $persistent是否是一个持久连接 $weight这台服务器在所有服务器中所占的权重: b! x3 S( d" {( \. u* N* ?8 h $timeout连接的持续时间) @7 \7 D/ x H( B/ ~4 d e $retry_interval连接重试的间隔时间,默认为15,设置为-1表示不进行重试4 j4 K( j: a7 K6 U4 n $status控制服务器的在线状态& q( S. f- N- ^/ t6 I5 S2 M9 I2 c $failure_callback允许设置一个回掉函数来处理错误信息。 9 D' @- j( q4 h# u% k 返回值: 如果成功则返回 TRUE,失败则返回 FALSE。
例子:
<?php
/* 面向对象API */ $memcache = new Memcache; $memcache->addServer(’memcache_host’, 11211); $memcache->addServer(’memcache_host2′, 11211);/ y# C5 o4 T2 a3 e /* 面向过程 API */ $memcache_obj = memcache_connect(’memcache_host’, 11211); memcache_add_server($memcache_obj, ’memcache_host2′, 11211);" X3 }5 }- _0 A. ~1 c ?> 0 a5 i% B, l6 w: g& f( y: [ - S; O0 V7 x. S9 H: x Memcache::close用法: i$ k- K. M( I- l: x bool Memcache::close ( void )% b9 B5 F4 r8 u$ B7 Z3 w 说明: 关闭memcache服务器连接。这个函数不会关闭长连接,长连接只有在web服务器关闭或者重启的时候才会关闭。相同的函数memcache_close()
返回值:" ?$ ] {/ F) U1 w; f0 M 如果成功则返回 TRUE,失败则返回 FALSE。 + _" t* N' c* Z, V8 L 例子:" w; ~+ k2 T: N6 B3 |
* 集群架构方面的问题 o memcached是怎么工作的?3 r3 }/ R+ V6 u" o o memcached最大的优势是什么? o memcached和MySQL的query cache相比,有什么优缺点?" D2 D2 l, F) S6 G o memcached和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点? o memcached的cache机制是怎样的? o memcached如何实现冗余机制? . c/ s! C1 k } o memcached如何处理容错的? o 如何将memcached中item批量导入导出? o 但是我确实需要把memcached中的item都dump出来,确实需要把数据load到memcached中,怎么办? o memcached是如何做身份验证的? o 如何使用memcached的多线程是什么?如何使用它们? o memcached能接受的key的最大长度是多少?(250bytes) o memcached对item的过期时间有什么限制?(为什么有30天的限制?) o memcached最大能存储多大的单个item?(1M byte) o 为什么单个item的大小被限制在1M byte之内?8 f ^/ L& A8 `9 D" Y7 `0 I o 为了让memcached更有效地使用服务器的内存,可以在各个服务器上配置大小不等的缓存空间吗?. q$ s, c9 A( V2 u" J) c o 什么是binary协议?它值得关注吗?6 ~% v! r5 C0 o" f8 O: I o memcached是如何分配内存的?为什么不用malloc/free!?究竟为什么使用slab呢?4 A7 Y/ z. |6 l3 W: M o memcached能保证数据存储的原子性吗? & j' M$ N( K1 }; K, K 集群架构方面的问题 ?) P7 _% i# K5 H/ |0 t; p Q memcached是怎么工作的? ; c$ b6 N# B0 ~8 E Memcached的神奇来自两阶段哈希(two-stage hash)。Memcached就像一个巨大的、存储了很多<key,value>对的哈希表。通过key,可以存储或查询任意的数据。# \; F0 R7 g" F* O' P
最后,从实现的角度看,memcached是一个非阻塞的、基于事件的服务器程序。这种架构可以很好地解决C10K problem ,并具有极佳的可扩展性。
可以参考A Story of Caching ,这篇文章简单解释了客户端与memcached是如何交互的。1 E/ P+ V3 S1 J( F2 L 7 y D* q- e0 z5 \' G [9 t7 n memcached最大的优势是什么?+ }8 Q/ F1 M% @' q L, i; p 1 H' G/ \* H J+ T2 `* C N2 Q9 x7 n 请仔细阅读上面的问题(即memcached是如何工作的)。Memcached最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。 由于客户端自己做了一次哈希,那么我们很容易增加大量memcached到集群中。memcached之间没有相互通信,因此不会增加 memcached的负载;没有多播协议,不会网络通信量爆炸(implode)。memcached的集群很好用。内存不够了?增加几台 memcached吧;CPU不够用了?再增加几台吧;有多余的内存?在增加几台吧,不要浪费了。
* local cache缺少集体失效(group invalidation)的特性。在memcached集群中,删除或更新一个key会让所有的观察者觉察到。但是在local cache中, 我们只能通知所有的服务器刷新cache(很慢,不具扩展性),或者仅仅依赖缓存超时失效机制。
* local cache面临着严重的内存限制,这一点上面已经提到。 n; Q- G$ U$ Q: P, P) n( f
memcached的cache机制是怎样的?
Memcached主要的cache机制是LRU(最近最少用)算法+超时失效。当您存数据到memcached中,可以指定该数据在缓存中可以呆多久 Which is forever, or some time in the future。如果memcached的内存不够用了,过期的slabs会优先被替换,接着就轮到最老的未被使用的slabs。) \# G: _9 C9 F! T - c5 {* Y b5 p& _ memcached如何实现冗余机制? 不实现!我们对这个问题感到很惊讶。Memcached应该是应用的缓存层。它的设计本身就不带有任何冗余机制。如果一个memcached节点失去了所 有数据,您应该可以从数据源(比如数据库)再次获取到数据。您应该特别注意,您的应用应该可以容忍节点的失效。不要写一些糟糕的查询代码,寄希望于 memcached来保证一切!如果您担心节点失效会大大加重数据库的负担,那么您可以采取一些办法。比如您可以增加更多的节点(来减少丢失一个节点的影 响),热备节点(在其他节点down了的时候接管IP),等等。
memcached如何处理容错的? _( x' `2 ]. \' r4 o" X1 o 不处理!:) 在memcached节点失效的情况下,集群没有必要做任何容错处理。如果发生了节点失效,应对的措施完全取决于用户。节点失效时,下面列出几种方案供您选择:2 n$ F' v) l) s; R" B/ u# |+ i
* 忽略它! 在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响。 7 ^+ }6 e1 M, J( Y6 | * 把失效的节点从节点列表中移除。做这个操作千万要小心!在默认情况下(余数式哈希算法),客户端添加或移除节点,会导致所有的缓存数据不可用!因为哈希参照的节点列表变化了,大部分key会因为哈希值的改变而被映射到(与原来)不同的节点上。; C" ` Z+ w/ _+ G* X
二进制协议尝试为端提供一个更有效的、可靠的协议,减少客户端/服务器端因处理协议而产生的CPU时间。5 n6 P9 M2 F/ [9 `- ?4 H% f 根据Facebook的测试,解析ASCII协议是memcached中消耗CPU时间最多的环节。所以,我们为什么不改进ASCII协议呢?1 K: l9 |/ f: w' A" e, }! ^' n
在这个邮件列表的thread中可以找到一些旧的信息:http://lists.danga.com/pipermail/memcached/2007-July/004636.html 。8 S; p# I4 Q; O; W# o3 r* W + U H3 I& B+ l memcached的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用slabs?8 p, \9 x& E, c$ H8 V8 T6 e% o 实际上,这是一个编译时选项。默认会使用内部的slab分配器。您确实确实应该使用内建的slab分配器。最早的时候,memcached只使用 malloc/free来管理内存。然而,这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片,OS最终花费大量 的时间去查找连续的内存块来满足malloc的请求,而不是运行memcached进程。如果您不同意,当然可以使用malloc!只是不要在邮件列表中 抱怨啊:) z% n8 Z- z. C/ i% [% u * V+ W- T; W. f. u slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks,一直被重复使用。因为内存被划分成大小不等的 slabs,如果item的大小与被选择存放它的slab不是很合适的话,就会浪费一些内存。Steven Grimm正在这方面已经做出了有效的改进。 ( x, r0 f$ ? w 邮件列表中有一些关于slab的改进(power of n 还是 power of 2)和权衡方案:http://lists.danga.com/pipermail/memcached/2006-May/002163.htmlhttp://lists.danga.com/pipermail/memcached/2007-March/003753.html 。/ I H; {" ?% L+ A. _