首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

[转]php与memcached服务器交互的分布式兑现源码分析[memcache版]

2013-03-01 
[转]php与memcached服务器交互的分布式实现源码分析[memcache版]原文链接:http://www.cnblogs.com/luckcs/

[转]php与memcached服务器交互的分布式实现源码分析[memcache版]

原文链接:http://www.cnblogs.com/luckcs/articles/2619846.html

前段时间,因为一个项目的关系,研究了php通过调用memcache和memcached?PECL扩展库的接口存储到分布式缓存服务器的机制,在此做我根据他们各自的源码进行分析,希望能对这方面感兴趣的人有些帮助。
本篇文章我会针对php和memcache扩展库的交互根据源码展开分析。
PHP调用memcache的接口通常会是如下过程:

?

代码,一个缓存key的生命周期就已经完整层现。从Memcache的初始化,到addServer添加两个服务器节点,接着set一个key到服务器上,然后get到这个key输出,最后delete这个key。在这个生命周期里,Memcache在底层究竟做了哪些事情,保证了数据存储服务器的均匀分布,数据的完整性?

?

接下来,我会根据上述生命周期的顺序,循序渐进的分析(由于主题是分布式算法的分析,所以接下来不相干的代码我会略去,很多分析我会直接备注在源码上)。


1. Memcache的初始化
对应PHP的代码:

?

函数名,在接下来的分析中会用到。忽略不会分析到的方法。

?以上代码有持久化hash算法的赋值实现,具体深入的了解请看Consistent hashing和国内大侠charlee翻译的小日本的文章memcached全面剖析–PDF总结篇。

?

?

Consistent hashing 算法最大的特点是当你的缓存服务器数量变更的时候,它能够最大化的保留原有的缓存不变,而不需要重新分布原有缓存的服务器位置。
至此,整个memcache_add_server流程结束。
3. 向缓存服务器保存数据

对应PHP的代码:

?由上可见分布式hash的核心函数皆为mmc_pool_find,首先找到key对应的服务器资源,然后根据服务器资源请求数据。

至此,memcache_get的过程结束。
5.向缓存服务器删除已保存的数据
对应的php代码:

memcache_delete:/* {{{ proto bool memcache_delete( object memcache, string key [, int expire ]) Deletes existing item */  PHP_FUNCTION(memcache_delete)  {  mmc_t *mmc;  mmc_pool_t *pool;  int result = -1, key_len;  zval *mmc_object = getThis();  char *key;  long time = 0;  char key_tmp[MMC_KEY_MAX_SIZE];  unsigned int key_tmp_len;    if (mmc_object == NULL) {  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &mmc_object, memcache_class_entry_ptr, &key, &key_len, &time) == FAILURE) {  return;  }  }  else {  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &key, &key_len, &time) == FAILURE) {  return;  }  }    if (!mmc_get_pool(mmc_object, &pool TSRMLS_CC) || !pool->num_servers) {  RETURN_FALSE;  }    if (mmc_prepare_key_ex(key, key_len, key_tmp, &key_tmp_len TSRMLS_CC) != MMC_OK) {  RETURN_FALSE;  }    // 先获得服务器资源  while (result < 0 && (mmc = mmc_pool_find(pool, key_tmp, key_tmp_len TSRMLS_CC)) != NULL) {  // 根据资源向缓存服务器发送请求删除存储的数据   if ((result = mmc_delete(mmc, key_tmp, key_tmp_len, time TSRMLS_CC)) < 0) {  mmc_server_failure(mmc TSRMLS_CC);  }  }    if (result > 0) {  RETURN_TRUE;  }  RETURN_FALSE;  }  /* }}} */ 

?

?

?

?

热点排行