[转]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; } /* }}} */?
?
?
?