±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎÄÖ÷Òª½éÉÜRedisÔÀí¡¢Ò»ÖÂÐÔ¹þÏ£Ëã·¨ÊÇÈçºÎÉè¼ÆÒÔ¼°¹þÏ£Ëã·¨µÄÆÀ¼ÛµÈÏà¹ØÄÚÈÝ¡£ |
|

redisÔÀíÆÊÎö
RedisÊÇÒ»¸ö¿ªÔ´µÄʹÓÃANSI CÓïÑÔ±àд¡¢Ö§³ÖÍøÂç¡¢¿É»ùÓÚÄÚ´æÒà¿É³Ö¾Ã»¯µÄÈÕÖ¾ÐÍ¡¢Key-ValueÊý¾Ý¿â¡£Ëü¿ÉÒÔÓÃ×÷Êý¾Ý¿â¡¢»º´æºÍÏûÏ¢Öмä¼þ¡£
/*
* Redis ¶ÔÏó
*/
typedef struct redisObject {
// ÀàÐÍ
unsigned type:4;
// ²»Ê¹ÓÃ(¶ÔÆëλ)
unsigned notused:2;
// ±àÂ뷽ʽ
unsigned encoding:4;
// LRU ʱ¼ä£¨Ïà¶ÔÓÚ server.lruclock£©
unsigned lru:22;
// ÒýÓüÆÊý
int refcount;
// Ö¸Ïò¶ÔÏóµÄÖµ
void *ptr;
} robj;
|
ËüÖ§³Ö¶àÖÖÀàÐ͵ÄÊý¾Ý½á¹¹£¬Èç ×Ö·û´®£¨strings£©£¬ É¢ÁУ¨hashes£©£¬ ÁÐ±í£¨lists£©£¬
¼¯ºÏ£¨sets£©£¬ ÓÐÐò¼¯ºÏ£¨sorted sets£© Ó뷶Χ²éѯ£¬ bitmaps£¬ hyperloglogs
ºÍ µØÀí¿Õ¼ä£¨geospatial£© Ë÷Òý°ë¾¶²éѯ¡£

hashes´æµÄÊÇ×Ö·û´®ºÍ×Ö·û´®ÖµÖ®¼äµÄÓ³É䣬±ÈÈçÒ»¸öÓû§Òª´æ´¢ÆäÈ«Ãû¡¢ÐÕÊÏ¡¢ÄêÁäµÈµÈ£¬¾ÍºÜÊʺÏʹÓùþÏ£¡£
ÆÀ¼Û¹þÏ£Ëã·¨ºÃ»µµÄËĸö¶¨Ò壺

redis¼¯Èº·½°¸£ºÒ»ÖÂÐÔhashËã·¨ Éè¼ÆÄ¿±êÊÇΪÁ˽â¾öÒòÌØÍøÖеÄÈȵã(Hot spot)ÎÊÌâ
Ò»ÖÂÐÔ¹þÏ£Ëã·¨ÊÇÈçºÎÉè¼Æ£º
»·ÐÎHash¿Õ¼ä
°´ÕÕ³£ÓõÄhashËã·¨À´½«¶ÔÓ¦µÄkey¹þÏ£µ½Ò»¸ö¾ßÓÐ2^32´Î·½¸öͰµÄ¿Õ¼äÖУ¬¼´0~(2^32)-1µÄÊý×Ö¿Õ¼äÖС£ÏÖÔÚÎÒÃÇ¿ÉÒÔ½«ÕâЩÊý×ÖͷβÏàÁ¬£¬ÏëÏó³ÉÒ»¸ö±ÕºÏµÄ»·ÐΡ£ÈçÏÂͼ
°ÑÊý¾Ýͨ¹ýÒ»¶¨µÄhashËã·¨´¦ÀíºóÓ³Éäµ½»·ÉÏ
ÏÖÔÚÎÒÃǽ«object1¡¢object2¡¢object3¡¢object4Ëĸö¶ÔÏóͨ¹ýÌØ¶¨µÄHashº¯Êý¼ÆËã³ö¶ÔÓ¦µÄkeyÖµ£¬È»ºóÉ¢Áе½Hash»·ÉÏ¡£ÈçÏÂͼ£º
Hash(object1) = key1£»
Hash(object2) = key2£»
Hash(object3) = key3£»
Hash(object4) = key4£»
½«»úÆ÷ͨ¹ýhashËã·¨Ó³Éäµ½»·ÉÏ
ÔÚ²ÉÓÃÒ»ÖÂÐÔ¹þÏ£Ëã·¨µÄ·Ö²¼Ê½¼¯ÈºÖн«ÐµĻúÆ÷¼ÓÈ룬ÆäÔÀíÊÇͨ¹ýʹÓÃÓë¶ÔÏó´æ´¢Ò»ÑùµÄHashËã·¨½«»úÆ÷Ò²Ó³Éäµ½»·ÖУ¨Ò»°ãÇé¿ö϶ԻúÆ÷µÄhash¼ÆËãÊDzÉÓûúÆ÷µÄIP»òÕß»úÆ÷ΨһµÄ±ðÃû×÷ΪÊäÈëÖµ£©£¬È»ºóÒÔ˳ʱÕëµÄ·½Ïò¼ÆË㣬½«ËùÓжÔÏó´æ´¢µ½Àë×Ô¼º×î½üµÄ»úÆ÷ÖС£
¼ÙÉèÏÖÔÚÓÐNODE1£¬NODE2£¬NODE3Èý̨»úÆ÷£¬Í¨¹ýHashËã·¨µÃµ½¶ÔÓ¦µÄKEYÖµ£¬Ó³Éäµ½»·ÖУ¬ÆäʾÒâͼÈçÏ£º
Hash(NODE1) = KEY1;
Hash(NODE2) = KEY2;
Hash(NODE3) = KEY3;
ͨ¹ýÉÏͼ¿ÉÒÔ¿´³ö¶ÔÏóÓë»úÆ÷´¦ÓÚͬһ¹þÏ£¿Õ¼äÖУ¬ÕâÑù°´Ë³Ê±Õëת¶¯object1´æ´¢µ½ÁËNODE1ÖУ¬object3´æ´¢µ½ÁËNODE2ÖУ¬object2¡¢object4´æ´¢µ½ÁËNODE3ÖС£ÔÚÕâÑùµÄ²¿Êð»·¾³ÖУ¬hash»·ÊDz»»á±ä¸üµÄ£¬Òò´Ë£¬Í¨¹ýËã³ö¶ÔÏóµÄhashÖµ¾ÍÄÜ¿ìËٵĶ¨Î»µ½¶ÔÓ¦µÄ»úÆ÷ÖУ¬ÕâÑù¾ÍÄÜÕÒµ½¶ÔÏóÕæÕýµÄ´æ´¢Î»ÖÃÁË¡£
»úÆ÷µÄɾ³ýÓëÌí¼Ó
ÆÕͨhashÇóÓàËã·¨×îΪ²»Í׵ĵط½¾ÍÊÇÔÚÓлúÆ÷µÄÌí¼Ó»òÕßɾ³ýÖ®ºó»áÕճɴóÁ¿µÄ¶ÔÏó´æ´¢Î»ÖÃʧЧ£¬ÕâÑù¾Í´ó´óµÄ²»Âú×ãµ¥µ÷ÐÔÁË¡£ÏÂÃæÀ´·ÖÎöÒ»ÏÂÒ»ÖÂÐÔ¹þÏ£Ëã·¨ÊÇÈçºÎ´¦ÀíµÄ¡£
1. ½Úµã£¨»úÆ÷£©µÄɾ³ý
ÒÔÉÏÃæµÄ·Ö²¼ÎªÀý£¬Èç¹ûNODE2³öÏÖ¹ÊÕϱ»É¾³ýÁË£¬ÄÇô°´ÕÕ˳ʱÕëÇ¨ÒÆµÄ·½·¨£¬object3½«»á±»Ç¨ÒƵ½NODE3ÖУ¬ÕâÑù½ö½öÊÇobject3µÄÓ³ÉäλÖ÷¢ÉúÁ˱仯£¬ÆäËüµÄ¶ÔÏóûÓÐÈκεĸ͝¡£ÈçÏÂͼ£º
2. ½Úµã£¨»úÆ÷£©µÄÌí¼Ó
Èç¹ûÍù¼¯ÈºÖÐÌí¼ÓÒ»¸öеĽڵãNODE4£¬Í¨¹ý¶ÔÓ¦µÄ¹þÏ£Ëã·¨µÃµ½KEY4£¬²¢Ó³Éäµ½»·ÖУ¬ÈçÏÂͼ£º
ͨ¹ý°´Ë³Ê±ÕëÇ¨ÒÆµÄ¹æÔò£¬ÄÇôobject2±»Ç¨ÒƵ½ÁËNODE4ÖУ¬ÆäËü¶ÔÏó»¹±£³ÖÕâÔÓеĴ洢λÖá£Í¨¹ý¶Ô½ÚµãµÄÌí¼ÓºÍɾ³ýµÄ·ÖÎö£¬Ò»ÖÂÐÔ¹þÏ£Ëã·¨ÔÚ±£³ÖÁ˵¥µ÷ÐÔµÄͬʱ£¬»¹ÊÇÊý¾ÝµÄÇ¨ÒÆ´ïµ½ÁË×îС£¬ÕâÑùµÄËã·¨¶Ô·Ö²¼Ê½¼¯ÈºÀ´ËµÊǷdz£ºÏÊʵ쬱ÜÃâÁË´óÁ¿Êý¾ÝÇ¨ÒÆ£¬¼õСÁË·þÎñÆ÷µÄµÄѹÁ¦¡£
ƽºâÐÔ
¸ù¾ÝÉÏÃæµÄͼ½â·ÖÎö£¬Ò»ÖÂÐÔ¹þÏ£Ëã·¨Âú×ãÁ˵¥µ÷ÐԺ͸ºÔؾùºâµÄÌØÐÔÒÔ¼°Ò»°ãhashËã·¨µÄ·ÖÉ¢ÐÔ£¬µ«Õ⻹²¢²»Äܵ±×öÆä±»¹ã·ºÓ¦ÓõÄÔÓÉ£¬ÒòΪ»¹È±ÉÙÁËÆ½ºâÐÔ¡£ÏÂÃæ½«·ÖÎöÒ»ÖÂÐÔ¹þÏ£Ëã·¨ÊÇÈçºÎÂú×ãÆ½ºâÐԵġ£hashËã·¨ÊDz»±£Ö¤Æ½ºâµÄ£¬ÈçÉÏÃæÖ»²¿ÊðÁËNODE1ºÍNODE3µÄÇé¿ö£¨NODE2±»É¾³ýµÄͼ£©£¬object1´æ´¢µ½ÁËNODE1ÖУ¬¶øobject2¡¢object3¡¢object4¶¼´æ´¢µ½ÁËNODE3ÖУ¬ÕâÑù¾ÍÕÕ³ÉÁ˷dz£²»Æ½ºâµÄ״̬¡£ÔÚÒ»ÖÂÐÔ¹þÏ£Ëã·¨ÖУ¬ÎªÁ˾¡¿ÉÄܵÄÂú×ãÆ½ºâÐÔ£¬ÆäÒýÈëÁËÐéÄâ½Úµã¡£
¡ª¡ª¡°ÐéÄâ½Úµã¡±£¨ virtual node £©ÊÇʵ¼Ê½Úµã£¨»úÆ÷£©ÔÚ hash ¿Õ¼äµÄ¸´ÖÆÆ·£¨ replica
£©£¬Ò»Êµ¼Ê¸ö½Úµã£¨»úÆ÷£©¶ÔÓ¦ÁËÈô¸É¸ö¡°ÐéÄâ½Úµã¡±£¬Õâ¸ö¶ÔÓ¦¸öÊýÒ²³ÉΪ¡°¸´ÖƸöÊý¡±£¬¡°ÐéÄâ½Úµã¡±ÔÚ hash
¿Õ¼äÖÐÒÔhashÖµÅÅÁС£
ÒÔÉÏÃæÖ»²¿ÊðÁËNODE1ºÍNODE3µÄÇé¿ö£¨NODE2±»É¾³ýµÄͼ£©ÎªÀý£¬Ö®Ç°µÄ¶ÔÏóÔÚ»úÆ÷Éϵķֲ¼ºÜ²»¾ùºâ£¬ÏÖÔÚÎÒÃÇÒÔ2¸ö¸±±¾£¨¸´ÖƸöÊý£©ÎªÀý£¬ÕâÑùÕû¸öhash»·ÖоʹæÔÚÁË4¸öÐéÄâ½Úµã£¬×îºó¶ÔÏóÓ³ÉäµÄ¹ØÏµÍ¼ÈçÏ£º
¸ù¾ÝÉÏͼ¿ÉÖª¶ÔÏóµÄÓ³Éä¹ØÏµ£ºobject1->NODE1-1£¬object2->NODE1-2£¬object3->NODE3-2£¬object4->NODE3-1¡£Í¨¹ýÐéÄâ½ÚµãµÄÒýÈ룬¶ÔÏóµÄ·Ö²¼¾Í±È½Ï¾ùºâÁË¡£ÄÇôÔÚʵ¼Ê²Ù×÷ÖУ¬ÕýÕæµÄ¶ÔÏó²éѯÊÇÈçºÎ¹¤×÷µÄÄØ£¿¶ÔÏó´Óhashµ½ÐéÄâ½Úµãµ½Êµ¼Ê½ÚµãµÄת»»ÈçÏÂͼ£º
¡°ÐéÄâ½Úµã¡±µÄhash¼ÆËã¿ÉÒÔ²ÉÓöÔÓ¦½ÚµãµÄIPµØÖ·¼ÓÊý×Öºó׺µÄ·½Ê½¡£ÀýÈç¼ÙÉèNODE1µÄIPµØÖ·Îª192.168.1.100¡£ÒýÈë¡°ÐéÄâ½Úµã¡±Ç°£¬¼ÆËã
cache A µÄ hash Öµ£º
Hash(¡°192.168.1.100¡±);
ÒýÈë¡°ÐéÄâ½Úµã¡±ºó£¬¼ÆËã¡°ÐéÄâ½Ú¡±µãNODE1-1ºÍNODE1-2µÄhashÖµ£º
Hash(¡°192.168.1.100#1¡±); // NODE1-1
Hash(¡°192.168.1.100#2¡±); // NODE1-2 |