k. To handle millions of users. Explain the following transactions
1) Adding/Deleting a friend
2) Friend suggestions
What if you cannot store all users on one server
һЩ´ó¹æÄ£ÍøÕ¾»áÓõ½µÄ³£ÓÃ×é¼þºÍ¼¼Êõ¡£
²Î¼ûhttp://tech.idv2.com/2008/08/17/memcached-pdf/
һЩҪµãÈçÏÂ
Ò»¸öµäÐ͵ÄÓÃÀý£º
³õʼ»¯Ò»¸öMemcacheµÄ¶ÔÏó£º
$mem = new Memcache;
Á¬½Óµ½ÎÒÃǵÄMemcache·þÎñÆ÷¶Ë£¬µÚÒ»¸ö²ÎÊýÊÇ·þÎñÆ÷µÄIPµØÖ·£¬Ò²¿ÉÒÔÊÇÖ÷»úÃû£¬µÚ¶þ¸ö²ÎÊýÊÇMemcacheµÄ¿ª·ÅµÄ¶Ë¿Ú£º
$mem->connect(¡°192.168.0.200¡å, 12000);
±£´æÒ»¸öÊý¾Ýµ½Memcache·þÎñÆ÷ÉÏ£¬µÚÒ»¸ö²ÎÊýÊÇÊý¾ÝµÄkey£¬ÓÃÀ´¶¨Î»Ò»¸öÊý¾Ý£¬µÚ¶þ¸ö²ÎÊýÊÇÐèÒª±£´æµÄÊý¾ÝÄÚÈÝ£¬ÕâÀïÊÇÒ»¸ö×Ö·û´®£¬µÚÈý¸ö²ÎÊýÊÇÒ»¸ö±ê¼Ç£¬Ò»°ãÉèÖÃΪ0»òÕßMEMCACHE_COMPRESSED¾ÍÐÐÁË£¬µÚËĸö²ÎÊýÊÇÊý¾ÝµÄÓÐЧÆÚ£¬¾ÍÊÇ˵Êý¾ÝÔÚÕâ¸öʱ¼äÄÚÊÇÓÐЧµÄ£¬Èç¹û¹ýÈ¥Õâ¸öʱ¼ä£¬ÄÇô»á±»Memcache·þÎñÆ÷¶ËÇå³ýµôÕâ¸öÊý¾Ý£¬µ¥Î»ÊÇÃ룬Èç¹ûÉèÖÃΪ0£¬ÔòÊÇÓÀÔ¶ÓÐЧ£¬ÎÒÃÇÕâÀïÉèÖÃÁË60£¬¾ÍÊÇÒ»·ÖÖÓÓÐЧʱ¼ä£º
$mem->set(¡®key1¡ä, ¡¯This is first value¡¯, 0, 60);
´ÓMemcache·þÎñÆ÷¶Ë»ñÈ¡Ò»ÌõÊý¾Ý£¬ËüÖ»ÓÐÒ»¸ö²ÎÊý£¬¾ÍÊÇÐèÒª»ñÈ¡Êý¾ÝµÄkey£¬ÎÒÃÇÕâÀïÊÇÉÏÒ»²½ÉèÖõÄkey1£¬ÏÖÔÚ»ñÈ¡Õâ¸öÊý¾ÝºóÊä³öÊä³ö£º
$val = $mem->get(¡®key1¡ä);
echo ¡±Get key1 value: ¡° . $val;
ÏÖÔÚÊÇʹÓÃreplace·½·¨À´Ìæ»»µôÉÏÃækey1µÄÖµ£¬replace·½·¨µÄ²ÎÊý¸úsetÊÇÒ»ÑùµÄ£¬²»¹ýµÚÒ»¸ö²ÎÊýkey1ÊDZØÐëÊÇÒªÌæ»»Êý¾ÝÄÚÈݵÄkey£¬×îºóÊä³öÁË£º
$mem->replace(¡®key1¡ä, ¡¯This is replace value¡¯, 0, 60);
$val = $mem->get(¡®key1¡ä);
echo ¡°Get key1 value: ¡± . $val;
ͬÑùµÄ£¬MemcacheÒ²ÊÇ¿ÉÒÔ±£´æÊý×éµÄ£¬ÏÂÃæÊÇÔÚMemcacheÉÏÃæ±£´æÁËÒ»¸öÊý×飬Ȼºó»ñÈ¡»ØÀ´²¢Êä³ö
$arr = array(¡®aaa¡¯, ¡¯bbb¡¯, ¡¯ccc¡¯, ¡¯ddd¡¯);
$mem->set(¡®key2¡ä, $arr, 0, 60);
$val2 = $mem->get(¡®key2¡ä);
print_r($val2);
ÏÖÔÚɾ³ýÒ»¸öÊý¾Ý£¬Ê¹ÓÃdelte½Ó¿Ú£¬²ÎÊý¾ÍÊÇÒ»¸ökey£¬È»ºó¾ÍÄܹ»°ÑMemcache·þÎñÆ÷Õâ¸ökeyµÄÊý¾Ýɾ³ý£¬×îºóÊä³öµÄʱºòûÓнá¹û
$mem->delete(¡®key1¡ä);
$val = $mem->get(¡®key1¡ä);
echo ¡°Get key1 value: ¡± . $val . ¡±
¡±;
×îºóÎÒÃÇ°ÑËùÓеı£´æÔÚMemcache·þÎñÆ÷ÉϵÄÊý¾Ý¶¼Çå³ý£¬»á·¢ÏÖÊý¾Ý¶¼Ã»ÓÐÁË£¬×îºóÊä³ökey2µÄÊý¾ÝΪ¿Õ£¬×îºó¹Ø±ÕÁ¬½Ó
$mem->flush();
$val2 = $mem->get(¡®key2¡ä);
echo ¡°Get key2 value: ¡±;
print_r($val2);
echo ¡±
¡±;
ÔÚ¶à»ú²¢ÐеÄʱºò£¬ÓÐÒ»¸öÑÏÖصÄÎÊÌâÊÇÔÚÔö¼õ»úÆ÷ºó£¬»á³öÏÖ´ó·¶Î§µÄ»º´æʧЧ£¨key±»Ó³Éäµ½²»Í¬µÄ»úÆ÷ÉÏ£©£¬½â¾ö·½·¨ÊÇʹÓÃconsistent hashing, ½éÉÜÔÚ£º
http://tech.idv2.com/2008/07/24/memcached-004/#content_2_6
Consistent HashingµÄ¼òµ¥ËµÃ÷
Consistent HashingÈçÏÂËùʾ£ºÊ×ÏÈÇó³ömemcached·þÎñÆ÷£¨½Úµã£©µÄ¹þÏ£Öµ£¬ ²¢½«ÆäÅäÖõ½0¡«2^32µÄÔ²£¨continuum£©ÉÏ¡£ È»ºóÓÃͬÑùµÄ·½·¨Çó³ö´æ´¢Êý¾ÝµÄ¼üµÄ¹þÏ£Öµ£¬²¢Ó³Éäµ½Ô²ÉÏ¡£ È»ºó´ÓÊý¾ÝÓ³Éäµ½µÄλÖÿªÊ¼Ë³Ê±Õë²éÕÒ£¬½«Êý¾Ý±£´æµ½ÕÒµ½µÄµÚÒ»¸ö·þÎñÆ÷ÉÏ¡£ Èç¹û³¬¹ý2^32ÈÔÈ»ÕÒ²»µ½·þÎñÆ÷£¬¾Í»á±£´æµ½µÚһ̨memcached·þÎñÆ÷ÉÏ¡£
ͼ4 Consistent Hashing£º»ù±¾ÔÀí
´ÓÉÏͼµÄ״̬ÖÐÌí¼Óһ̨memcached·þÎñÆ÷¡£ÓàÊý·Ö²¼Ê½Ëã·¨ÓÉÓÚ±£´æ¼üµÄ·þÎñÆ÷»á·¢Éú¾Þ´ó±ä»¯ ¶øÓ°Ï컺´æµÄÃüÖÐÂÊ£¬µ«Consistent HashingÖУ¬Ö»ÓÐÔÚcontinuumÉÏÔö¼Ó·þÎñÆ÷µÄµØµãÄæʱÕë·½ÏòµÄ µÚһ̨·þÎñÆ÷Éϵļü»áÊܵ½Ó°Ïì¡£
ͼ5 Consistent Hashing£ºÌí¼Ó·þÎñÆ÷
Òò´Ë£¬Consistent Hashing×î´óÏ޶ȵØÒÖÖÆÁ˼üµÄÖØзֲ¼¡£ ¶øÇÒ£¬ÓеÄConsistent HashingµÄʵÏÖ·½·¨»¹²ÉÓÃÁËÐéÄâ½ÚµãµÄ˼Ïë¡£ ʹÓÃÒ»°ãµÄhashº¯ÊýµÄ»°£¬·þÎñÆ÷µÄÓ³ÉäµØµãµÄ·Ö²¼·Ç³£²»¾ùÔÈ¡£ Òò´Ë£¬Ê¹ÓÃÐéÄâ½ÚµãµÄ˼Ï룬Ϊÿ¸öÎïÀí½Úµã£¨·þÎñÆ÷£© ÔÚcontinuumÉÏ·ÖÅä100¡«200¸öµã¡£ÕâÑù¾ÍÄÜÒÖÖÆ·Ö²¼²»¾ùÔÈ£¬ ×î´óÏ޶ȵؼõС·þÎñÆ÷Ôö¼õʱµÄ»º´æÖØзֲ¼¡£
ͨ¹ýÏÂÎÄÖнéÉܵÄʹÓÃConsistent HashingËã·¨µÄmemcached¿Í»§¶Ëº¯Êý¿â½øÐвâÊԵĽá¹ûÊÇ£¬ ÓÉ·þÎñÆ÷̨Êý£¨n£©ºÍÔö¼ÓµÄ·þÎñÆ÷̨Êý£¨m£©¼ÆËãÔö¼Ó·þÎñÆ÷ºóµÄÃüÖÐÂʼÆË㹫ʽÈçÏ£º
(1 ¨C n/(n+m)) * 100
ÁíÍ⻹ÓÐÒ»¸öÐèÇóÊǽ«memcacheÖеÄÊý¾Ý³Ö¾Ã»¯£¬¿ÉÒÔ¿¼ÂǶ¨Æڳ־û¯¡£
¹ØÓÚNoSQLµÄÎÄÕÂ
http://sebug.net/paper/databases/nosql/Nosql.html