Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
µ¥»úÊý¾Ý¿âµÄʵÏÖ
 
  3836  次浏览      31
 2018-3-20  
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcsdn,ÎÄÕÂÊÇ´ÓÊý¾Ý¿â¡¢RDB³Ö¾Ã»¯¡¢AOF³Ö¾Ã»¯¡¢Ê¼þ¡¢¿Í»§¶Ë¡¢·þÎñÆ÷µÈ·½ÃæÊǽéÉܵġ£

Ò»¡¢Êý¾Ý¿â

£¨Ò»£©·þÎñÆ÷ÖеÄÊý¾Ý¿â

ËùÓÐÊý¾Ý¿â¶¼±£´æÔÚ·þÎñÆ÷״̬redis.h/redisServer½á¹¹µÄdbÊý×飨ÿ¸öÏî¶¼ÊÇredisDb½á¹¹£¬Ã¿¸öredisDb½á¹¹¶¼´ú±íÒ»¸öÊý¾Ý¿â£©ÖУ¬ÔÚ³õʼ»¯·þÎñÆ÷ʱ£¬³ÌÐò»á¸ù¾Ý·þÎñÆ÷״̬µÄdbnumÊôÐÔÀ´¾ö¶¨Ó¦¸Ã´´½¨¶àÉÙ¸öÊý¾Ý¿â¡£dbnumÊôÐÔµÄÖµÓÉ·þÎñÆ÷ÅäÖõÄdatabaseÑ¡Ïî¾ö¶¨£¬Ä¬ÈϵÄÖµÊÇ16¡£

£¨¶þ£©Çл»Êý¾Ý¿â £¨SELECT£©

ÿ¸öredis¿Í»§¶ËÓÐ×Ô¼ºµÄÄ¿±êÊý¾Ý¿â£¬¿ÉÒÔͨ¹ýSELECTÃüÁîÀ´Çл»µ±Ç°Êý¾Ý¿â¡£

¿Í»§¶ËûÓзµ»Øµ±Ç°Êý¾Ý¿âºÅµÄÃüÁÔÚÖ´ÐÐΣÏÕÃüÁî֮ǰÏÈÏÔʽµØÇл»µ½Ö¸¶¨µÄÊý¾Ý¿â£¬È»ºóºÍÖ´ÐдËÃüÁî¡£

£¨Èý£©Êý¾Ý¿â¼ü¿Õ¼ä

redisDb½á¹¹ÖеÄdict×ֵ䱣´æÁËÊý¾Ý¿âÖÐËùÓеļüÖµ¶Ô£¬³ÆÖ®Îª¼ü¿Õ¼ä¡£

Ìí¼Ó¼ü¡¢É¾³ý¼ü¡¢¸üмü¡¢¶Ô¼üȡֵ¡¢Çå¿ÕÊý¾Ý¿â£¨FLUSHDB£©¡¢Ëæ»ú·µ»ØÊý¾Ý¿âµÄij¸ö¼ü£¨RANDOMKEY£©¡¢·µ»ØÊý¾Ý¿â¼üÊýÁ¿£¨DBSIZE£©¡¢EXISTS¡¢RENAME¡¢KEYSµÈµÈ£¬¶¼ÊÇͨ¹ý¶Ô¼ü¿Õ¼ä½øÐвÙ×÷À´ÊµÏֵġ£

¶Áд¼ü¿Õ¼äʱµÄά»¤²Ù×÷£º¸üмü¿Õ¼äµÄÃüÖдÎÊýºÍ²»ÃüÖдÎÊý£¨INFO statsÃüÁîµÄkeyspace_hitsÊôÐÔºÍkeyspace_missessÊôÐÔÖв鿴£©£»¸üÐÂLRUÏÐÖÃʱ¼ä£»É¾³ý¹ýÆÚ¼ü£»¿Í»§¶ËʹÓÃWATCHÃüÁî¼àÊÓ£¬ÐÞ¸ÄÖ®ºóµÄ¼ü»á±»±ê¼ÇΪdirty£¬´Ó¶øÈÃÊÂÎñ³ÌÐò×¢Òâµ½Õâ¸ö¼üÒѾ­±»Ð޸Ĺý£»·þÎñÆ÷ÐÞ¸ÄÒ»¸ö¼üÖ®ºó£¬¶¼»á¶Ôdirty¼ü¼ÆÊýÆ÷¼Ó1£¬Õâ¸ö¼ÆÊýÆ÷»á´¥·¢·þÎñÆ÷µÄ³Ö¾Ã»¯ÒÔ¼°¸´ÖƲÙ×÷£»Èç¹û·þÎñÆ÷¿ªÆôÁËÊý¾Ý¿â֪ͨ¹¦ÄÜ£¬ÄÇôÔÚ¶Ô¼ü½øÐÐÐÞ¸ÄÖ®ºó£¬·þÎñÆ÷»á °´ÕÕÅäÖ÷¢ËÍÏàÓ¦µÄÊý¾Ý¿â֪ͨ¡£

£¨ËÄ£©ÉèÖüüµÄÉú´æÊ±¼ä»ò¹ýÆÚʱ¼ä

EXPIRE PEXPIRE EXPIREAT PEXPIREAT TTL PTTL¡£

redisDbµÄexpires×ֵ䱣´æÊý¾Ý¿âÖÐËùÓмüµÄ¹ýÆÚʱ¼ä£¬ÆäÖмü±£´æµÄÊǼü¿Õ¼äij¸ö¼üµÄÖ¸Õ룬¶øÖµÔòÊÇÒ»¸ölong longÀàÐ͵ÄÕûÊý£¬Õâ¸öÕûÊý±£´æÁ˼üËùÖ¸ÏòµÄÊý¾Ý¿â¼üµÄ¹ýÆÚʱ¼ä¡ªÒ»¸öºÁÃ뾫¶ÈµÄUNIXʱ¼ä´Á¡£

¹ýÆÚ¼üµÄÅж¨£ºis_expired(key)¡£

£¨Î壩¹ýÆÚ¼üµÄɾ³ý²ßÂÔ

¶¨Ê±É¾³ý£¨´´½¨¶¨Ê±Æ÷£¬¶ÔÄÚ´æÓѺ㬶Ôcpu×î²»ÓѺã©¡¢¶èÐÔɾ³ý£¨¶ÔCPU×îÓѺ㬶ÔÄÚ´æ×î²»ÓѺã©¡¢¶¨ÆÚɾ³ý£¨ÕûºÏÕÛÖУ©¡£

£¨Áù£©redis²ÉÓõIJßÂÔ

¶èÐÔɾ³ý£¨db.c/expireIfNeeded£©ºÍ¶¨ÆÚɾ³ý(redis.c/activeExpireCycle)¡£

£¨Æß£©AOF¡¢RDBºÍ¸´Öƹ¦ÄܶԹýÆÚ¼üµÄ´¦Àí

1¡¢Éú³ÉRDBÎļþ£ºSAVE»òÕßBGSAVE£¬³ÌÐò»á½øÐйýÆÚ¼üµÄ¼ì²â£¬²»»áÓ°ÏìRDBÎļþµÄÉú³É¡£

2¡¢ÔØÈëRDbÎļþ£º·þÎñÆ÷ÒÔÖ÷·þÎñÆ÷ģʽÔËÐУ¨¹ýÆÚ¼ü»á±»¹ýÂË£©£¬·þÎñÆ÷ÒÔ´Ó·þÎñÆ÷ÔËÐÐʱ£¨ËùÓмü¶¼¼ÓÈëÊý¾Ý¿â£¬µ«ÊÇÖ÷´Ó·þÎñÆ÷ͬ²½Êý¾ÝµÄʱºò»á°Ñ´Ó·þÎñÆ÷Êý¾Ý¿âÈ«²¿Çå³ý£¬Òò´ËҲûÓÐÓ°Ï죩¡£

3¡¢AOFÎļþдÈ룺³ÌÐòÏòAOFÎļþ×·¼ÓDELÃüÁÏÔʽµØ¼Ç¼¸Ã¼üÒѱ»É¾³ý¡£

4¡¢AOFÖØÐ´£ºBGREWRITEAOFÃüÁ³ÌÐò¼ì²é¡£

5¡¢¸´ÖÆ£ºµ±·þÎñÆ÷ÔËÐи´ÖÆÄ£Ê½ÏÂʱ£¬´Ó·þÎñÆ÷µÄ¹ýÆÚ¼üɾ³ý¶¯×÷ÓÉÖ÷·þÎñÆ÷¿ØÖÆ¡£Ö÷·þÎñÆ÷¸ºÔðɾ³ý¹ýÆÚ¼ü²¢Í¬²½£¬´Ó·þÎñÆ÷Ïñ´¦Àíδ¹ýÆÚµÄ¼üÒ»ÑùÀ´´¦Àí¹ýÆÚ¼ü¡£

£¨°Ë£©Êý¾Ý¿â֪ͨ£¨redis.conf/notify-keyspace-events£©

redisÃüÁî¶ÔÊý¾Ý¿â½øÐÐÐÞ¸ÄÖ®ºó£¬·þÎñÆ÷»á¸ù¾ÝÅäÖÃÏò¿Í»§¶Ë·¢ËÍÊý¾Ý¿â֪ͨ¡£

ÒÔ keyspace Ϊǰ׺µÄƵµÀ±»³ÆÎª¼ü¿Õ¼ä֪ͨ£¨key-space notification£©£¬ ¶øÒÔ keyevent Ϊǰ׺µÄƵµÀÔò±»³ÆÎª¼üʼþ֪ͨ£¨key-event notification£©¡£

1¡¢·¢ËÍ֪ͨ£ºnotify.c/notifyKeyspaceEventº¯ÊýʵÏֵġ£

2¡¢·¢ËÍ֪ͨµÄʵÏÖ£º

¶þ¡¢RDB³Ö¾Ã»¯

redisÊÇÄÚ´æÊý¾Ý¿â£¬Èç¹û²»±£´æµ½´ÅÅ̵ϰ£¬·þÎñÆ÷½ø³ÌÒ»µ©Í˳öÊý¾Ý¿â״̬¾Í»áÏûʧ¡£RDB³Ö¾Ã¹¦ÄܾÍÊǽ«redisµÄÄÚ´æ×´Ì¬±£´æµ½´ÅÅÌÀïÃæ£¬±ÜÃâÊý¾ÝÒâÍⶪʧ¡£redis³Ö¾Ã»¯¼È¿ÉÒÔÊÖ¶¯Ö´ÐУ¬Ò²¿ÉÒÔ¸ù¾Ý·þÎñÆ÷µÄÅäÖÃÑ¡ÏÆÚÖ´ÐС£Í¨¹ýSAVE£¨×èÈû£©ºÍBGSAVE£¨×Ó½ø³Ì´¦Àí£©¡£

SAVE¡¢BGSAVEºÍBGREWRITEAOF£ºBGSAVEÔÚÖ´ÐÐʱ£¬¾Ü¾øSAVE£»BGSAVEÔÚÖ´ÐÐʱ£¬¾Ü¾øBGSAVE£»BGSAVEÖ´ÐÐʱ£¬BGREWRITEAOF±»ÑÓºóÖ´ÐУ»BGREWRITEAOFÖ´ÐÐʱ£¬BGSAVE»á±»¾Ü¾ø¡£

ͨ¹ýÅäÖ÷þÎñÆ÷µÄsaveÑ¡ÏÈ÷þÎñÆ÷ÿ¸ôÒ»¶Îʱ¼ä×Ô¶¯Ö´ÐÐÒ»´ÎBGSAVEÃüÁ¿ÉÒÔÉèÖöà¸öÑ¡ÏÈκÎÒ»¸ö±»Âú×ã¾ÍÖ´ÐÐBGSAVE¡£·þÎñÆ÷ͨ¹ýsaveÑ¡ÏÉèÖ÷þÎñÆ÷״̬redisServer½á¹¹µÄsaveparamsÊôÐÔ£¬saveparams ÊÇÒ»¸öÊý×飬ÿ¸öÔªËØÊÇÒ»¸ösaveparam½á¹¹£¬ÀïÃæ±£´æÊ±¼äºÍÐ޸ĴÎÊýÁ½¸ö²ÎÊý¡£

redisServer½á¹¹»¹Î¬³ÖÁËÒ»¸ödirty£¨Ð޸ĴÎÊý£©¼ÆÊýÆ÷ºÍÒ»¸ölastsave£¨Éϴα£´æÊ±¼äµÄunixʱ¼ä´Á£©¡£¼ì²éÌõ¼þÊÇ·ñÂú×ãµÄÖÜÆÚÐÔ²Ù×÷º¯ÊýserverCron¡£

RDBÎļþµÄ½á¹¹£º

REDIS+db_version+databases+EOF+check_sum£»£¨´óС±íʾ³£Á¿£¬Ð¡Ð´±íʾ±äÁ¿ºÍÊý¾Ý£©

databases£ºSELECTDB£¨1×Ö½Ú³£Á¿£¬±êÖ¾½ÓÏÂÀ´Òª¶ÁÈëµÄÊÇÊý¾Ý¿âµÄºÅÂ룩+db_number£¨Êý¾Ý¿âºÅÂ룩+key_value_pairs£¨ËùÓмüÖµ¶ÔÊý¾Ý£©£»

key_value_pairs£º²»´ø¹ýÆÚʱ¼äµÄ¼üÖµ¶Ô£¨TYPE£¨¶ÔÏóÀàÐÍ»òÕߵײã±àÂ룩+key£¨¼ü¶ÔÏó£©+value£¨Öµ¶ÔÏ󣩣©£»´ø¹ýÆÚʱ¼äµÄ¼üÖµ¶Ô£¨EXPIRETIME_MS£¨±êÖ¾½ÓÏÂÀ´Òª¶ÁÈëµÄÊÇÒ»¸öÒÔºÁÃëΪµ¥Î»µÄ¹ýÆÚʱ¼ä£©+ms£¨ÒÔºÁÃëΪµ¥Î»µÄunixʱ¼ä´Á£¬Ò²¾ÍÊǼüÖµ¶ÔµÄ¹ýÆÚʱ¼ä £©+TYPE+key+value£©¡£

value±àÂë:¸ù¾ÝTYPEÀàÐ͵IJ»Í¬£¬valueµÄ½á¹¹ºÍ³¤¶ÈÒ²»áÓÐËù²»Í¬¡£

×Ö·û´®¶ÔÏó£º TYPEֵΪREDIS_RDB_TYPE_STRINGʱ£¬ValueµÄ±àÂë·ÖΪINT£¨ENCODING+integer£©ºÍRAW£¨Ñ¹Ëõ£¨REDIS_RDB_ENC_LZF+compressed_len+origin_len+compressed_string£©£»²»Ñ¹Ëõ£¨len+string£©£©£¨RDBÎļþѹËõ¹¦ÄÜÐèÒª¿ªÆô£¬²Î¿¼redis.confÎļþµÄedbcompressionÑ¡ÏѹËõ²ÉÓÃLZFËã·¨£©¡£

Áбí¶ÔÏó£º TYPEֵΪREDIS_RDB_TYPE_LISTʱ£¬Value±£´æµÄÊÇÒ»¸öREDIS_ENCODING_LINKEDLIST±àÂëµÄÁбí¶ÔÏ󣬣¨list_length+len1+string1+len2+string2¡­.£©¡£

¼¯ºÏ¶ÔÏó£º TYPEֵΪREDIS_RDB_TYPE_SETʱ£¬value±£´æµÄÊÇÒ»¸öREDIS_ENCODING_HT±àÂëµÄ¼¯ºÏ¶ÔÏ󣬣¨set_size+len1+string1+len2+string2¡­.£©¡£

¹þÏ£±í¶ÔÏó£º TYPEֵΪREDIS_RDB_TYPE_HASHʱ£¬value±£´æµÄÊÇÒ»¸öREDIS_ENCODING_HT±àÂëµÄ¼¯ºÏ¶ÔÏ󣬣¨hash_size+key1+value1+key2+value2¡­.£©.

ÓÐÐò¼¯ºÏ£º TYPEֵΪREDIS_RDB_TYPE_ZSETʱ£¬value±£´æµÄÊÇÒ»¸öREDIS_ENCODING_SKIPLIST±àÂëµÄÓÐÐò¼¯ºÏ¶ÔÏ󣬣¨sorted_set_size+member1+score1+member2+score2¡­.£©¡£

IntSet±àÂëµÄ¼¯ºÏºÍzipLIST±àÂëµÄÁÐ±í¡¢¹þÏ£±í»òÕßÓÐÐò¼¯ºÏ£º ¶¼Êǽ«ÆäÏÈת»»³ÉΪ×Ö·û´®´æ´¢¡£

·ÖÎöRDBÎļþ£º od -cx dump.rdb£¨-c±íʾascllÂ룬-x±íʾ16½øÖÆ£¬Ä¬ÈÏÊÇ8½øÖÆ£©£»redis×ÔÉí´øÓÐRDBÎļþ¼ì²é¹¤¾ßredis-check-dump¡£

£¨Èý£©AOF³Ö¾Ã»¯£¨append only file£©

AOF³Ö¾Ã»¯ÊÇͨ¹ý±£´æRedis·þÎñÆ÷ËùÖ´ÐеÄÃüÁ¼Ç¼Êý¾Ý¿âµÄ״̬µÄ¡£

дÈëÊÇwirteº¯ÊýдÈëµ½»º³åÇø£»²Ù×÷ϵͳ»¹ÌṩÁËfsyncºÍfdatasyncÁ½¸öͬ²½º¯Êý£¬Ç¿ÖÆÈòÙ×÷ϵͳÁ¢¼´½«»º³åÇøµÄÊý¾ÝдÈëµ½Ó²ÅÌ¡£

1¡¢AOF³Ö¾Ã»¯µÄʵÏÖ£º·ÖΪÃüÁî×·¼Ó£¨append£©¡¢ÎļþдÈë¡¢Îļþͬ²½£¨sync£©Èý¸ö²½Öè¡£

¢ÙÃüÁî×·¼Ó£ºµ±AOF³Ö¾Ã»¯¹¦ÄÜ´¦ÓÚ´ò¿ª×´Ì¬Ê±£¬·þÎñÆ÷Ö´ÐÐÍêÒ»¸öÃüÁîÖ®ºó£¬»áÒÔЭÒé¸ñʽ½«±»Ö´ÐеÄдÃüÁî×·¼Óµ½·þÎñÆ÷״̬µÄaof_buf»º³åÇøµÄĩ⣨redisServerÖÐÓиösds½á¹¹ÀàÐ͵Äaof_buf£©¡£

¢ÚAOFÎļþµÄдÈëÓëͬ²½£º redisµÄ·þÎñÆ÷½ø³ÌÊÇÒ»¸öʱ¼äÑ­»·£¨loop£©£¬Îļþʼþ¸ºÔðºÍ¿Í»§¶ËͨÐÅ£¬Ê±¼äʼþÖ´Ðж¨Ê±²Ù×÷£¬¶øÔÚÿ´Î½áÊøÒ»¸öʼþÑ­»·Ö®Ç°£¬»áµ÷ÓÃflushAppendOnlyFileº¯Êý£¬¿¼ÂÇÊÇ·ñ°Ñaof_bufµÄÄÚÈÝдÈëºÍ±£´æµ½AOFÎļþµ±ÖУ¬¾ßÌ庯ÊýÐÐΪÓзþÎñÆ÷ÅäÖÃredis.conf/appendfsyncÑ¡ÏîµÄÖµÀ´¾ö¶¨£¨always½«ËùÓÐÄÚÈÝдÈ벢ͬ²½¡¢everysecдÈëËùÓÐÄÚÈݲ¢ÔÚÉÏÒ»´Îͬ²½³¬¹ý1ÃëÖӾͽøÐÐͬ²½£¨Í¬²½²Ù×÷ÓÐÒ»¸öÏß³ÌרߺÔ𣩡¢no£¨Ð´ÈëÄÚÈݲ»Í¬²½£¬ºÎʱͬ²½ÓɲÙ×÷ϵͳ¾ö¶¨£©£©¡£

2¡¢AOFÎļþµÄÔØÈëÓëÊý¾Ý»¹Ô­

´´½¨Ò»¸ö²»´øÍøÂçÁ¬½ÓµÄα¿Í»§¶Ë£¬´ÓAOFÎļþÖзÖÎö²¢¶ÁȡһÌõÃüÁʹÓÃα¿Í»§¶ËÖ´Ðб»¶Á³öµÄдÃüÁî£¬Ò»Ö±ÖØ¸´Ö´ÐÐ2ºÍ3²½Ö裬ֱµ½AOFµÄËùÓÐдÃüÁî±»´¦ÀíÍê±Ï¡£

3¡¢AOFÖØÐ´£¨ÖØÐ´AOFÎļþÌå»ýҪСºÜ¶à£¬²»»á°üº¬ÈκÎÀ˷ѿռäµÄÈßÓàÃüÁ

¢ÙAOFÎļþÖØÐ´µÄʵÏÖ£¨aof_rewrite£©£ºÖ±½Ó´ÓÊý¾Ý¿â¶ÁÈ¡¶ÔÏó£¬È»ºóÓÃеÄÃüÁîÀ´±£´æ¶ÔÓ¦µÄ¶ÔÏóµÄ²Ù×÷ÃüÁµ±ÖØÐ´³ÌÐòÔÚ´¦ÀíÓжà¸öÔªËØµÄ¼üʱ£¬»áÏȼì²é¼üµÄÊýÁ¿£¬Èç¹û³¬¹ýÁËredis.h/REDIS_AOF_REWITE_ITEMS_PER_CMD³£Á¿µÄÖµ£¬ÄÇô»áÓöàÌõÃüÁîÀ´´æ´¢£¬Ä¿Ç°´Ë³£Á¿µÄÖµÊÇ64¡£

¢ÚAOFºóÌ¨ÖØÐ´£º

±ÜÃâÖØÐ´µ¼Ö·þÎñÆ÷×èÈû£¬AOFÖØÐ´²Ù×÷·Åµ½×Ó½ø³ÌÈ¥Ö´ÐУ»ÎªÁ˱ÜÃâÖØÐ´µÄ¹ý³ÌÖÐÊý¾Ý¿âÓÐеÄÐ޸ĵ¼ÖÂAOFÎļþºÍµ±Ç°Êý¾Ý¿â״̬²»Ò»Ö£¬redis·þÎñÆ÷ÉèÖÃÁËÒ»¸öAOFÖØÐ´»º³åÇø£¬×Ó½ø³ÌÍê³ÉÖØÐ´Ö®ºó£¬¸¸½ø³Ì½«ËùÓÐÖØÐ´»º³åÇøµÄÄÚÈÝдÈ뵽еÄAOFÎļþÖУ¬²¢Ô­×ӵظ²¸ÇÏÖÓеÄAOFÎļþ¡£

£¨ËÄ£©Ê¼þ

redis·þÎñÆ÷ÊÇÒ»¸öʼþÇý¶¯³ÌÐò£¬ÐèÒª´¦ÀíÁ½Ààʼþ£ºÎļþʼþ£¨Í¨¹ýÌ×½Ó×ÖÓëÆäËû·þÎñÆ÷»òÕ߿ͻ§¶ËͨÐŲúÉú£©ºÍʱ¼äʼþ£¨·þÎñÆ÷µÄһЩ¶¨Ê±²Ù×÷£©¡£

1¡¢Îļþʼþ£º

»ùÓÚreactorģʽ¿ª·¢ÁË×Ô¼ºµÄÍøÂç´¦ÀíÆ÷£¬Õâ¸ö´¦ÀíÆ÷±»³ÆÎªÎļþʼþ´¦ÀíÆ÷£¨file event handler£©¡£

×é³É£ºÌ×½Ó×Ö£¨²úÉúÎļþʼþ£©¡¢I/O¶à·¸´ÓóÌÐò£¨½«²úÉúʼþµÄÌ×½Ó×Ö¶¼·Åµ½Ò»¸ö¶ÓÁÐÀïÃæ£¬È»ºóÓÐÐò¡¢Í¬²½¡¢Ã¿´ÎÒ»¸öÌ×½Ó×ÖÏò·ÖÅÉÆ÷´«ËÍÌ×½Ó×Ö£©¡¢Îļþʼþ·ÖÅÉÆ÷£¨¸ù¾ÝÌ×½Ó×Ö²úÉúʼþµÄÀàÐ͵÷ÓÃÏàÓ¦µÄʼþ´¦ÀíÆ÷£©¡¢Ê¼þ´¦ÀíÆ÷£¨Ò»¸ö¸öµÄº¯ÊýÖ´ÐÐÏàÓ¦µÄ²Ù×÷£©¡£

I/O¶à·¸´ÓóÌÐòµÄʵÏÖ£º select¡¢epoll¡¢evport¡¢kqueue£¬ÀûÓú궨ÒåÁËÏàÓ¦µÄ¹æÔò£¬±àÒëʱ»á×Ô¶¯Ñ¡ÔñϵͳÖÐÐÔÄÜ×î¸ßµÄI/O¶à·¸´Óú¯Êý¿âÀ´×÷ΪredisI/O¶à·¸´ÓóÌÐòµÄµ×²ãʵÏÖ¡£

ʼþµÄÀàÐÍ£º ¿Í»§¶Ë£¨write¡¢close¡¢ÐµĿÉÓ¦´ðÌ×½Ó×Öaccept¡¢connect£©²úÉúAE_READALEʼþ£»¿Í»§¶ËÖ´ÐÐread²Ù×÷ʱ£¬²úÉúAE_WRITABLEʼþ¡£Í¬Ê±²úÉúʱ£¬ÏÈ´¦Àíreadºó´¦Àíwrite¡£

API£º

ae.c/aeCreateFileEvent£º£¨º¯Êý½ÓÊÜÒ»¸öÌ×½Ó×ÖÃèÊö·û¡¢Ò»¸öʼþÀàÐÍ¡¢Ò»¸öʼþ´¦ÀíÆ÷×÷Ϊ²ÎÊý£¬²¢½«¸ø¶¨Ì×½Ó×ֵĸø¶¨Ê¼þ¼ÓÈëµ½I/O¶à·¸´ÓóÌÐòµÄ¼àÌý·¶Î§ÄÚ£¬²¢¶ÔʼþºÍʼþ´¦ÀíÆ÷½øÐйØÁª£©£»

ae.c/aeDeleteFileEvent£º£¨ÉÙÒ»¸öʼþ´¦ÀíÆ÷²ÎÊý£¬ÓëÉÏÒ»¸öº¯ÊýÏà·´£©£»ae.c/aeGetFileEvent£º£¨½ÓÊÜÒ»¸öÌ×½Ó×ÖÃèÊö·û²ÎÊý£¬·µ»ØÌ×½Ó×ÖÕýÔÚ±»¼àÌýµÄʼþÀàÐÍ£©£»

ae.c/aeWait£º£¨º¯Êý½ÓÊÜÒ»¸öÌ×½Ó×ÖÃèÊö·û¡¢Ò»¸öʼþÀàÐÍ¡¢Ò»¸öºÁÃëÊýΪ²ÎÊý£¬ÔÚ¸ø¶¨µÄʱ¼äÄÚ×èÈû²¢µÈ´ýÌ×½Ó×ֵĸø¶¨ÀàÐÍʼþµÄ·¢Éú£¬µ±Ê±¼ä³É¹¦²úÉú»òÕߵȴý³¬Ê±Ö®ºóº¯Êý·µ»Ø£©£»

ae.c/aeApiPoll£º£¨½ÓÊÜÒ»¸ösys/time.h/struct timeval½á¹¹Îª²ÎÊý£¬²¢ÔÚÖ¸¶¨µÄʱ¼äÄÚ £¬×èÈû²¢µÈ´ýËùÓб»aeCreateFileEventº¯ÊýÉèÖÃΪ¼àÌý״̬µÄÌ×½Ó×Ö²úÉúµÄÎļþʼþ£¬µ±ÓÐÖÁÉÙÒ»¸öʼþ²úÉú»òÕß³¬Ê±º¯Êý·µ»Ø£©£»

ae.c/aeProcessEvents£º£¨Îļþʼþ·ÖÅÉÆ÷£¬µ÷ÓÃaeApiPollº¯ÊýÀ´µÈ´ýʼþ²úÉú£¬È»ºó±éÀúÒѲúÉúµÄʼþ£¬²¢µ÷ÓÃÏàÓ¦µÄʼþ´¦ÀíÆ÷À´´¦ÀíÕâЩʼþ£©£»

ae.c/aeGetApiName£º£¨·µ»ØI/O¶à·¸´ÓóÌÐòµ×²ãËùʹÓÃI/O¶à·¸´Óú¯Êý¿âµÄÃû³Æ£©¡£

ÎļþʼþµÄ´¦ÀíÆ÷£º Á¬½ÓÓ¦´ð´¦ÀíÆ÷¡¢ÃüÁîÇëÇó´¦ÀíÆ÷¡¢ÃüÁî»Ø¸´´¦ÀíÆ÷ºÍ¸´ÖÆ´¦ÀíÆ÷¡£

Á¬½ÓÓ¦´ð´¦ÀíÆ÷£º£¨networking.c/acceptTcpHandlerº¯Êý£¬¾ßÌåʵÏÖÊÇsys/socket.h/accept º¯ÊýµÄ°ü×°£©

ÃüÁîÇëÇó´¦ÀíÆ÷£º£¨networking.c/readQueryFromClientº¯Êý£¬¾ßÌåʵÏÖÊÇunistd.h/readº¯ÊýµÄ°ü×°£©¡£

ÃüÁî»Ø¸´´¦ÀíÆ÷£º£¨networking.c/sendReplyToClientº¯Êý£¬¾ßÌåʵÏÖÊÇunistd.h/writeº¯ÊýµÄ°ü×°£©¡£

Ò»´ÎÍêÕûµÄ¿Í»§¶ËÓë·þÎñÆ÷Á¬½ÓʼþʵÀý£º¿Í»§¶Ë·¢ËÍÁ¬½ÓÇëÇ󡪷þÎñÆ÷Ó¦´ðÁ¬½ÓÇëÇó²¢½«readʼþÓëÃüÁîÇëÇó´¦ÀíÆ÷¹ØÁª¡ª¿Í»§¶Ë·¢ËÍÃüÁîÇëÇ󡪷þÎñÆ÷Òý·¢ÃüÁîÇëÇó´¦ÀíÆ÷¡ª¿Í»§¶Ë¶ÁÈ¡ÃüÁî»Ø¸´¡ª´¥·¢·þÎñÆ÷ÃüÁî»Ø¸´´¦ÀíÆ÷

2¡¢Ê±¼äʼþ£º

·ÖΪ¶¨Ê±Ê¼þ£¨ÈÃÒ»¶Î³ÌÐòÔÚÖ¸¶¨µÄʱ¼ä Ö®ºóÖ´ÐÐÒ»´Î£©ºÍÖÜÆÚÐÔʼþ£¨ÈÃÒ»¶Î³ÌÐòÿ¸ôÒ»¶ÎÖ¸¶¨Ê±¼ä¾ÍÖ´ÐÐÒ»´Î£©¡£

Èý¸öÊôÐÔ×é³É£ºid£¨È«¾ÖΨһID£©¡¢when£¨Ê±¼äʼþµ½´ïµÄunixʱ¼ä´Á£©¡¢timeproc£¨Ê±¼äʼþ´¦ÀíÆ÷£¬·µ»ØÖµÎªae.h/AE_NOMOREʱ±íʾ´ËʼþΪ¶¨Ê±Ê¼þ£¬·ñÔò±íʾÖÜÆÚÐÔʼþ£©

API£ºae.c/aeCreateTimeEvent£¨´´½¨Ò»¸öеÄʱ¼äʼþµ½·þÎñÆ÷£©¡¢ae.c/aeDeleteTimeEvent£¨´Ó·þÎñÆ÷ɾ³ýID¶ÔÓ¦µÄʱ¼äʼþ£©¡¢ae.c/aeSearchNearestTimer£¨·µ»Ø¾àÀ뵱ǰʱ¼ä×î½üʱ¼äʼþµÄID£©¡¢ae.c/aeProcessTimeEvent£¨±éÀúµ½´ïµÄʱ¼äʼþ£©¡£

ʱ¼äʼþÓ¦ÓÃʵÀý£ºserverCronº¯Êý

·þÎñÆ÷¶¨ÆÚ¶Ô×ÔÉíµÄ×ÊÔ´ºÍ״̬½øÐмì²éºÍµ÷Õû£¬´Ó¶øÈ·±£·þÎñÆ÷¿ÉÒÔ³¤ÆÚÎȶ¨µØÔËÐУ¬ÕâЩ¶¼ÊÇÓÉredis.h/serverCronº¯ÊýÀ´Ö´ÐУ¬Ö÷Òª¹¤×÷°üÀ¨£º

¸üзþÎñÆ÷µÄ¸÷Ààͳ¼ÆÐÅÏ¢£¬±ÈÈçʱ¼ä¡¢ÄÚ´æÕ¼Óá¢Êý¾Ý¿âÕ¼ÓõÈÇé¿ö£»

ÇåÀíÊý¾Ý¿âµÄ¹ýÆÚ¼ü£»

¹Ø±ÕºÍÇåÀíÁ¬½ÓʧЧµÄ¿Í»§¶Ë£»

³¢ÊÔ½øÐÐAOFºÍRDB³Ö¾Ã»¯²Ù×÷£»

Èç¹û·þÎñÆ÷ÊÇÖ÷·þÎñÆ÷£¬ÄÇô¶Ô´Ó·þÎñÆ÷½øÐж¨ÆÚͬ²½£»

Èç¹û´¦ÓÚ¼¯ÈºÄ£Ê½£¬ÄÇô½øÐж¨ÆÚͬ²½ºÍÁ¬½Ó²âÊÔ¡£

serverCronº¯Êýÿ¸ôÒ»¶Îʱ¼äÖ´ÐÐÒ»´Î£¬2.6°æ±¾ÊÇ100msÒ»´Î£¬2.8°æ±¾¿ÉÒÔͨ¹ýredis.confµÄhzÑ¡Ïî½øÐÐÐ޸ġ£

3¡¢Ê¼þµÄµ÷¶ÈÓëÖ´ÐУº

ʼþµÄµ÷¶ÈºÍºÍÖ´ÐÐÊÇÓÉae.c/aeProcessEventsº¯Êý¸ºÔð¡£

·þÎñÆ÷µÄÔËÐйý³Ì£º»ñÈ¡µ±Ç°µ½´ïʱ¼ä×î½üµÄ ʱ¼äʼþ£¬¼ÆËã´ïµ½Ê±¼ä£¬Ã»µ½´ïµÄ»°¾Í×èÈû²¢µÈ´ýÎļþʼþµÄ·¢Éú£¨×î´ó×èÈûʱ¼äÓÉ´«ÈëµÄtimeval½á¹¹¾ö¶¨£©£¬´¦ÀíËùÓÐÒѲúÉúµÄÎļþʼþ£¬´¦ÀíÒѵ½´ïµÄʱ¼äʼþ£¬È»ºóÔÙÑ­»·µ½µÚÒ»²½£¬Ö±µ½·þÎñÆ÷Í˳ö¡£ÓÉÓÚÎļþʼþµÄ´¦ÀíÔÚǰ£¬ËùÒÔʱ¼äʼþµÄ´¦ÀíÓпÉÄܱÈÉ趨µÄµ½´ïʱ¼äÉÔÍíÒ»µã¡£

£¨Î壩¿Í»§¶Ë

redisSever½á¹¹ÀïÃæÓÐclientsÊôÐÔ£¬ÊÇÒ»¸öredisClientµÄÁ´±í¡£

1¡¢¿Í»§¶ËÊôÐÔ£ºÍ¨ÓÃÊôÐÔºÍÌØ¶¨¹¦ÄÜÏà¹ØÊôÐÔ£¬¶¼´æ´¢ÔÚredisClient½á¹¹ÌåÖÐ

Ì×½Ó×ÖÃèÊö·û£¨fd£©£º CLIENT list²é¿´µ±Ç°ËùÓпͻ§¶ËÐÅÏ¢£»Î±¿Í»§¶ËµÄfdΪ-1£¬ÆÕͨ¿Í»§¶ËµÄֵΪ´óÓÚ-1µÄÕûÊý¡£

Ãû×Ö£¨name£©£º CLIENT setname name¿ÉÒÔÉèÖÿͻ§¶ËµÄÃû×Ö£»CLIENT getname¿ÉÒÔ»ñÈ¡¿Í»§¶ËµÄÃû×Ö¡£

±êÖ¾£¨flags£©£º¼Ç¼Á˿ͻ§¶ËµÄ½ÇÉ«£¬ÒÔ¼°¿Í»§¶ËĿǰµÄËù´¦×´Ì¬£»ËùÓбêÖ¾¶¼¶¨ÒåÔÚredis.hÎļþÀïÃæ¡££¨PUBSUBºÍScript loadÃüÁîµÄÌØÊâÐÔ£ºÇ°Ò»¸öÃüÁî»áÏòËùÓж©ÔÄÕß·¢ËÍÏûÏ¢²¢¸Ä±ä¿Í»§¶Ë״̬£¬Òò´ËÓи±×÷Ó㻺óÒ»¸öÃüÁîÐÞ¸ÄÁË·þÎñÆ÷µÄ״̬£»Òò´ËÐèÒª·þÎñÆ÷ʹÓÃREDIS_FORCE_AOF±êÖ¾Ç¿ÖÆ°ÑÕâ¸öÃüÁîдÈëAOF¡££©

ÊäÈ뻺³åÇø£¨querybuf£©£º ±£´æ¿Í»§¶ËµÄÃüÁîÇëÇó£¬×î´ó²»³¬¹ý1G£¬·ñÔò¹Ø±ÕÕâ¸ö¿Í»§¶Ë¡£

ÃüÁîÓëÃüÁî²ÎÊý£¨argv£¨²ÎÊý£©ºÍargc£¨²ÎÊý¸öÊý£©£©£º ·þÎñÆ÷½«¿Í»§¶Ë·¢ËÍÃüÁîÇëÇó±£´æÔÚ¿Í»§¶Ë״̬µÄquerybufÖ®ºó£¬·þÎñÆ÷½«¶ÔÃüÁîÇëÇó½øÐзÖÎö£¬²¢½«µÃ³öµÄÃüÁî²ÎÊýºÍÃüÁî²ÎÊýµÄ¸öÊý±£´æÔÚÕâÁ½¸öÊôÐÔÀïÃæ¡£argvÊÇÒ»¸öÊý×飬argv[0]ÊÇÒªÖ´ÐеÄÃüÁ¶øÖ®ºóÊÇÆäËûÏî´«¸øÃüÁîµÄ²ÎÊý£»argcÊôÐԼǼargvÊý×éµÄ³¤¶È¡£

ÃüÁîµÄʵÏÖº¯Êý£º ·þÎñÆ÷¸ù¾Ýargv[0]µÄÖµ²éÕÒÃüÁî±í£¨×ֵ䣩ÖÐÃüÁî¶ÔÓ¦µÄÃüÁîʵÏÖº¯Êý¡£×ÖµäµÄ¼üÊÇSDS£¬ÖµÊǶÔÓ¦µÄredisCommand½á¹¹£¨Õâ¸ö½á¹¹±£´æÁËÃüÁîµÄʵÏÖº¯Êý¡¢ÃüÁîµÄ±êÖ¾¡¢ÃüÁîÓ¦¸Ã¸ø¶¨µÄ²ÎÊý¸öÊý¡¢ÃüÁîµÄ×ÜÖ´ÐдÎÊýºÍ×ÜÏûºÄʱ³¤µÈͳ¼ÆÐÅÏ¢£©£¬ÕÒµ½redisCommand½á¹¹Ö®ºó·þÎñÆ÷»á½«¿Í»§¶Ë״̬µÄcmdÖ¸ÕëÖ¸ÏòÕâ¸ö½á¹¹¡£ÃüÁî²»Çø·Ö´óСд£¡

Êä³ö»º³åÇø£º

Ö´ÐÐÃüÁîËùµÃµ½µÄÃüÁî»Ø¸´»á±»±£´æÔÚ¿Í»§¶Ë״̬µÄÊä³ö»º³åÇøÀïÃæ£¬Ã¿¸ö¿Í»§¶Ë¶¼ÓÐÁ½¸öÊä³ö»º³åÇø£ºÒ»¸ö´óСÊǹ̶¨µÄ£¨redisClient½á¹¹ÏÂÃæµÄbufºÍbufposÊôÐÔ×é³É£©£¬bufÊÇÒ»¸ö´óСΪREDIS_REPLY_CHUNK_BYTES£¨Ä¿Ç°Ä¬ÈÏÊÇ16KB£©×Ö½ÚµÄ×Ö½ÚÊý×飬bufposÊôÐÔÔò¼Ç¼ÁËbufÊý×éĿǰʹÓõÄ×Ö½ÚÊýÁ¿£»ÁíÒ»¸ö»º³åÇøµÄ´óСÊǿɱäµÄ£¬ÓÉreplyÁ´±íÀ´Á¬½Ó×Ö·û´®¶ÔÏó¡£

Éí·ÝÑéÖ¤£º authenticatedÊôÐÔÓÃÓڼǼ¿Í»§¶ËÊÇ·ñͨ¹ýÁËÉí·ÝÑéÖ¤£¬Îª0±íʾΪͨ¹ýÉí·ÝÑéÖ¤£¬Îª1±íʾͨ¹ýÁËÉí·ÝÑéÖ¤¡£·þÎñÆ÷Æô¶¯Éí·ÝÑéÖ¤²ÅÓÐЧ£¬¾ßÌå²Î¿¼ÅäÖÃÎļþrequirepassÑ¡ÏîµÄÏà¹ØËµÃ÷¡£

ʱ¼ä£º ctime£¨¿Í»§¶ËÓë·þÎñÆ÷Á¬½ÓÁ˶àÉÙÃ룩¡¢lastinteraction£¨¿Í»§¶ËºÍ·þÎñÆ÷×îºóÒ»´Î»¥¶¯µÄʱ¼ä£¬¿ÉÒÔÓÃÀ´¼ÆËã¿Í»§¶ËµÄ¿Õתʱ¼ä£¬CLIENT listµÄidleÊôÐÔ¾ÍÊÇ´ÓÕâ¼ÆË㣩¡¢obuf_soft_limit_reached_time£¨¼Ç¼Êä³ö»º³åÇøµÚÒ»µ½´ïÈíÐÔÏÞÖÆµÄʱ¼ä£©¡£

2¡¢¿Í»§¶ËµÄ´´½¨ºÍ¹Ø±Õ

ÆÕͨ¿Í»§¶Ë£º´´½¨¿Í»§¶ËÏàÓ¦µÄ¿Í»§¶Ë״̬£¬²¢½«¿Í»§¶Ë״̬Ìí¼Óµ½·þÎñÆ÷״̬½á¹¹clientsÁ´±íµÄĩβ£»¹Ø±Õ¿Í»§¶ËÓкܶàÖÖÔ­Òò£º¿Í»§¶Ë½ø³ÌÍ˳ö£»¿Í»§¶Ë·¢ËͲ»·ûºÏЭÒé¸ñʽµÄÃüÁîÇëÇ󣻿ͻ§¶Ë³ÉΪCLIENT KILLÃüÁîµÄÄ¿±ê£»·þÎñÆ÷ÉèÖÃÁËtimeoutÅäÖÃÑ¡Ï¿Õתʱ¼ä³¬¹ý´Ëֵʱ¿Í»§¶Ë½«¸ø¹Ø±Õ£©£¬µ«ÊÇÖ÷´Ó·þÎñÆ÷×÷Ϊ¿Í»§¶Ë±»ÃüÁî×èÈûʱÊDz»»á±»¹Ø±ÕµÄ£»ÊäÈ뻺³åÇø³¬ÏÞÖÆ£»Êä³ö»º³åÇø³¬ÏÞÖÆ£¨·þÎñÆ÷ʹÓÃÁ½ÖÖģʽÀ´ÏÞÖÆ¿Í»§¶ËÊä³ö»º³åÇøµÄ´óС;Ó²ÐÔÏÞÖÆ¡ª³¬³öÓ²ÐÔÏÞÖÆÖ±½Ó¹Ø±Õ¿Í»§¶ËºÍÈíÐÔÏÞÖÆ¡ª³ÖÐøÊ±¼ä³¬¹ýÉ趨ʱ³¤Ê±¹Ø±Õ¿Í»§¶Ë£©¡££¨client_output_buffer_limitÑ¡Ïî¿ÉÒÔΪÆÕͨ¿Í»§¶Ë¡¢´Ó·þÎñÆ÷¿Í»§¶ËºÍ·¢²¼Óë¶©ÔŦÄܵĿͻ§¶Ë·Ö±ðÉèÖò»Í¬µÄÈíÐÔÏÞÖÆºÍÓ²ÐÔÏÞÖÆ£¬¾ßÌå²Î¿¼redis.confµÄclient_output_buffer_limitÑ¡Ï

LUA½Å±¾µÄα¿Í»§¶Ë£º

·þÎñÆ÷ÔÚ³õʼ»¯Ê±´´½¨¸ºÔðÖ´ÐÐlua½Å±¾Öаüº¬µÄredisÃüÁîµÄα¿Í»§¶Ë£¬²¢½«Õâ¸öα¿Í»§¶Ë¹ØÁªÔÚ·þÎñÆ÷״̬½á¹¹µÄlua_client£¨redisClient½á¹¹Ö¸Õ룩ÊôÐÔÖУ¬Õâ¸ö¿Í»§¶Ë»áÔÚ·þÎñÆ÷ÉúÃüÖÜÆÚÖÐһֱά³Ö£¬Ö»ÓзþÎñÆ÷¹Ø±ÕÖ®ºóÕâ¸ö¿Í»§¶Ë²Å»á±»¹Ø±Õ¡£

AOFα¿Í»§¶Ë£º

·þÎñÆ÷ÔÚÔØÈëAOFÎļþʱ£¬»á´´½¨ÓÃÓÚÖ´ÐÐAOFÎļþ°üº¬µÄredisÃüÁîµÄα¿Í»§¶Ë²¢ÔÚÔØÈëÍê³ÉÖ®ºó¹Ø±ÕÕâ¸ö¿Í»§¶Ë¡£

£¨Áù£©·þÎñÆ÷

·þÎñÆ÷´¦ÀíÃüÁî¹ý³Ì£¬serverCronº¯ÊýËù½øÐеÄÏêϸ²Ù×÷£¬·þÎñÆ÷ÔÚÆô¶¯ºÍ½ÓÊܿͻ§¶ËÃüÁîÇëÇóÖ®¼äËù×öµÄ×¼±¸¹¤×÷¡£

1¡¢ÃüÁîÇëÇóµÄÖ´Ðйý³Ì

¿Í»§¶Ë·¢ËÍÃüÁîÇëÇ󣨽«ÃüÁîת»»³ÉЭÒé¸ñʽ£¬Ì×½Ó×Ö½«Ð­Òé¸ñʽµÄÃüÁîÇëÇó·¢Ë͸ö·þÎñÆ÷£©£»

·þÎñÆ÷¶ÁÈ¡ÃüÁîÇëÇ󣨽«Ì×½Ó×ÖµÄЭÒé¸ñʽ±£´æµ½ÊäÈ뻺³åÇø£»¶ÔÊäÈ뻺³åÇøµÄÃüÁîÇëÇó½øÐзÖÎö£¬ÌáÈ¡ÃüÁî²ÎÊýºÍÃüÁî²ÎÊý¸öÊý±£´æµ½argvºÍargc£»ÌõÓÃÃüÁîÖ´ÐÐÆ÷Ö´Ðпͻ§¶ËÃüÁ£»

ÃüÁîÖ´ÐÐÆ÷£¨1£©£º²éÕÒÃüÁ²éÕÒ²ÎÊýËùÖ¸¶¨µÄÃüÁî²¢½«ÕÒµ½µÄÃüÁî±£´æÔÚcmdÊôÐÔÀïÃæ£©£¬ÃüÁî±íʾ×ֵ䣬×ÖµäµÄ¼üÊÇÃüÁîµÄÃû×Ö£¬×ÖµäµÄÖµÊÇredisCommand½á¹¹£¨¼Ç¼Á˺ܶàÊôÐÔ£ºname¡¢proc¡¢arity¡¢sfalgs£¨ÃüÁîµÄÊôÐÔ£¬ÀýÈçÊǶÁ»¹ÊÇд¡¢ÊÇ·ñÔÚÔØÈëÊý¾ÝʱʹÓá¢ÊÇ·ñÔÊÐíÔÚlua½Å±¾ÖÐʹÓõȣ©¡¢flags¡¢calls¡¢milliseconds£©£»

ÃüÁîÖ´ÐÐÆ÷£¨2£©£ºÖ´ÐÐÔ¤±¸²Ù×÷£¨ÔÚÕæÕýÖ´ÐÐÃüÁîÒÔǰ£¬³ÌÐò»¹ÐèÒª½øÐÐһЩԤ±¸²Ù×÷£¬°üÀ¨£ºcmdÖ¸ÕëÊÇ·ñΪ¿Õ£¬cmdµÄarity¶ÔÓ¦µÄ²ÎÊý¸öÊýÊÇ·ñÕýÈ·£¬¿Í»§¶ËÊÇ·ñͨ¹ýÁËÉí·ÝÑéÖ¤£¬maxmemory¹¦ÄÜ´ò¿ªµÄ»°Òª¼ì²é·þÎñÆ÷ÄÚ´æµÄÕ¼ÓÃÇé¿ö£¬BGSAVEÃüÁî³ö´í²¢ÇÒ·þÎñÆ÷¿ªÆôÁËstop-writes-on-bgsave-error¹¦ÄܾܾøÐ´ÃüÁîµÄÖ´Ðеȣ©

ÃüÁîÖ´ÐÐÆ÷£¨3£©£ºµ÷ÓÃÃüÁîµÄʵÏÖº¯Êý£¬client->cmd->proc£¨client£©»òÕßµÈÓÚÖ´ÐÐsetCommand£¨client£©£¬²¢½«µ÷ÓòúÉúµÄ»Ø¸´½á¹û±£´æµ½¿Í»§¶Ë״̬µÄbufÊôÐÔÀïÃæ¡£

ÃüÁîÖ´ÐÐÆ÷£¨4£©£ºÖ´ÐкóÐø¹¤×÷£¨ÊÇ·ñÐèÒªÌí¼ÓÂýÈÕÖ¾£»¸üÐÂredisCommandµÄmillssecondsÊôÐÔ£¬²¢½«calls¼Ó1£»AOF¿ªÆôµÄ»°£¬³Ö¾Ã»¯Ä£¿é»á°Ñ¸Õ¸ÕÖ´ÐеÄÃüÁîдÈëµ½AOF»º³åÇø£»Èç¹ûÓÐÆäËû·þÎñÆ÷ÔÚ¸´ÖÆÕâ¸ö·þÎñÆ÷£¬ÄÇô·þÎñÆ÷»á°Ñ¸Õ¸ÕÖ´ÐеÄÃüÁî´«²¥¸øËùÓдӷþÎñÆ÷£©¡£

½«ÃüÁî»Ø¸´¸ø¿Í»§¶Ë£º

¿Í»§¶Ë½ÓÊÕ²¢´òÓ¡»Ø¸´ÃüÁ

2¡¢serverCronº¯Êý£¨Ä¬ÈÏ100msÖ´ÐÐÒ»´Î£©

**¸üзþÎñÆ÷ʱ¼ä»º´æ£º**redisServerµ±ÖÐÓÐÁ½¸öʱ¼äµÄ»º´æunixtime£¨±£´æµ±Ç°µÄunixʱ¼ä´Á£©ºÍmstime£¨ºÁÃë¼¶¾«¶ÈµÄµ±Ç°unixʱ¼ä´Á£©¡£Ä¬ÈÏ100ms¸üÐÂÒ»´Î£¬Òò´Ë¾«¶È²»¸ß£¬¶ÔÓÚ¾«¶ÈÒªÇó¸ßµÄͨ¹ýÖ´ÐÐϵͳµ÷Óá£

**¸üÐÂLRUʱÖÓ£º**redisServer/lruclock£º22£¨LRUʱÖÓ£¬Ã¿10s¸üÐÂÒ»´Î£©¡¢redisObject/lru£º22£¨¶ÔÏó×îºóÒ»´Î±»ÃüÁî·ÃÎʵÄʱ¼ä£©£¬Í¨¹ýinfo server¿ÉÒԲ鿴¡£

**¸üзþÎñÆ÷ÿÃëÖ´ÐÐÃüÁîµÄ´ÎÊý£º**trackOperationsPerSecondº¯ÊýÒÔ100msÒ»´ÎµÄƵÂÊÖ´ÐУ¬ÒÔ³éÑù¼ÆËãµÄ·½Ê½¹ÀËã²¢¼Ç¼·þÎñÆ÷ÔÚ×î½üÒ»ÃëÖÓ ´¦ÀíµÄÃüÁîÇëÇóµÄÊýÁ¿£¨Õâ¸öÖµ¿ÉÒÔͨ¹ýinfo statsÃüÁîµÄinstantneous_ops_per_secÓò²é¿´£©¡£Õâ¸öº¯ÊýÓëredisServerµÄËĸöÊôÐÔÓйأ¨ops_sec_last_sample_timeÉÏÒ»´Î½øÐгéÑùµÄʱ¼ä£»ops_sec_last_sample_opsÉϴγéÑùʱ·þÎñÆ÷ÒÑÖ´ÐеÄÃüÁîµÄÊýÁ¿£»ops_sec_last_samples[REDIS_OPS_SEC_SAMPLES]´óСĬÈÏΪ16µÄ»·ÐÎÊý×飬ÿ¸öÏî¶¼¼Ç¼ÁËÒ»´Î³éÑùµÄ½á¹û£»ops_sec_idx»·ÐÎÊý×éµÄË÷ÒýÖµ£¬Ã¿´Î³éÑùÔö1£¬µÈÓÚ16ʱÖÃÁ㣩¡£µ±¿Í»§¶ËÖ´ÐÐinfoÃüÁîµÄʱºò£¬·þÎñÆ÷¾Í»áµ÷ÓÃgetOperationPerSecondº¯Êý¡£

¸üзþÎñÆ÷ÄÚ´æ·åÖµ¼Ç¼£º·þÎñÆ÷״̬µÄstat_peak_memoryÊôÐԼǼÁË·þÎñÆ÷ÄÚ´æ·åÖµµÄ´óС£¬Ã¿´ÎserverCronº¯ÊýÖ´ÐеÄʱºò¶¼»á½«µ±Ç°µÄÄÚ´æÊ¹ÓÃÇé¿öºÍÕâÖµ½øÐбȽϣ¬²¢°Ñ½Ï´óÖµ´æÔÚ´ËÖµÖУ¬INFO memoryÃüÁîµÄused_memory_peakºÍused_memory_peak_humanµÄÁ½¸öÓò¼Ç¼ÁË·þÎñÆ÷µÄÄÚ´æ·åÖµ¡£

**´¦ÀíSIGTERMÐźţº**sigtermHandlerº¯Êý£¬Õâ¸öÐźŴ¦ÀíÆ÷¸ºÔðÔÚ·þÎñÆ÷½ÖµÀsigtermÐźÅʱ£¬´ò¿ª·þÎñÆ÷״̬µÄshutdown_asap±êʶ£¬Ã¿´ÎserverCronº¯ÊýÔËÐÐʱ»á¶Ô±êʶ½øÐмì²é£¬²¢¸ù¾ÝÊôÐÔµÄÖµ¾ö¶¨ÊÇ·ñ¹Ø±Õ·þÎñÆ÷£¨1¹Ø±Õ£¬0²»×ö¶¯×÷£©¡£¹Ø±Õ·þÎñÆ÷֮ǰ»á½øÐÐRDB³Ö¾Ã»¯²Ù×÷¡£

**¹ÜÀí¿Í»§¶Ë×ÊÔ´£º**serverCronº¯Êýÿ´ÎÖ´Ðж¼»áµ÷ÓÃclientCronº¯Êý£¬clientCronº¯Êý»á¶ÔÒ»¶¨ÊýÁ¿µÄ¿Í»§¶Ë½øÐÐÁ½¸ö¼ì²é£º¿Í»§¶ËºÍ·þÎñÆ÷Ö®¼äµÄÁ¬½Ó³¬Ê±£¨ºÜ³¤Ê±¼äûÓл¥¶¯£©£¬ÄÇô³ÌÐòÊÍ·ÅÕâ¸ö¿Í»§¶Ë£»Èç¹û¿Í»§¶ËÔÚÉÏÒ»´ÎÖ´ÐÐÃüÁîÇëÇóÖ®ºóÊäÈ뻺³åÇø³¬¹ýÁËÒ»¶¨µÄ³¤¶È£¬ÄÇô³ÌÐò»áÊͷŵ±Ç°µÄ»º³åÇø£¬²¢ÖØÐ´´½¨Ò»¸öĬÈÏ´óСµÄÊäÈ뻺³åÇø´Ó¶ø·ÀÖ¹¿Í»§¶ËÊäÈ뻺³åÇøºÄ·ÑÁ˹ý¶àµÄÄÚ´æ¡£

**¹ÜÀíÊý¾Ý¿â×ÊÔ´£º**serverCronº¯Êýÿ´ÎÖ´Ðж¼»áµ÷ÓÃdatabasesCronº¯Êý£¬Õâ¸öº¯Êý»á¶Ô·þÎñÆ÷ÖеÄÒ»²¿·ÖÊý¾Ý¿â½øÐмì²é£¬É¾³ýÆäÖеĹýÆÚ¼ü£¬²¢ÔÚÓÐÐèÒªµÄʱºò¶Ô×ֵ佸ÐÐÊÕËõ²Ù×÷£¬¾ßÌå²Î¿¼µÚ¾ÅÕ¡£

Ö´Ðб»ÑÓ³ÙµÄREWRITEAOF£º BGSAVEÖ´ÐеÄʱºò£¬REWRITEAOFÃüÁî»á±»ÑÓ³Ù£¬·þÎñÆ÷״̬µÄaof_rewrite_scheduled±êʶ£¨1±êʶ±»ÑÓ³ÙÁË£©¼Ç¼ÁË·þÎñÆ÷ÊÇ·ñÑÓ³ÙÁËREWRITEAOFÃüÁî¡£

¼ì²é³Ö¾Ã»¯²Ù×÷µÄÔËÐÐ״̬£º ·þÎñÆ÷״̬ÓÃrdb_child_pidºÍaof_child_pidÊôÐԼǼÁËÖ´ÐÐBGSAVEÃüÁîºÍREWRITEAOFÃüÁîµÄ×Ó½ø³ÌµÄID£¬ÕâÁ½¸öÊôÐÔ¿ÉÒÔÓÃÓÚ¼ì²éÕâÁ½¸öÃüÁîÊÇ·ñÕýÔÚÖ´ÐУ¨Ã»ÓÐÖ´ÐеĻ°ÖµÎª-1£©£¬serverCronº¯Êýÿ´ÎÖ´Ðж¼»á¼ì²é£¬Ö»ÒªÓÐÒ»¸ö²»Îª-1£¬³ÌÐò»áÖ´ÐÐÒ»´Îwait3º¯Êý£¬¼ì²é×Ó½ø³ÌÊÇ·ñÓÐÐźŷ¢¸ø·þÎñ½ø³Ì£¬Èç¹ûÓÐÐźŵ½´ï¾ÍÖ»ÏëºóÐø²Ù×÷£¨±ÈÈçеÄRDBÎļþÌæ»»ÏÖÓеÄRDBÎļþ»òÕßÖØÐ´µÄAOFÎļþÌæ»»ÏÖÓеÄaofÎļþµÈ£©£¬Ã»ÓÐÐźŵ½´ïÔò±íʾ³Ö¾Ã»¯²Ù×÷δÍê³É£¬²»×öÈκζ¯×÷£»Èç¹ûÁ½¸öÊôÐÔÖµ¶¼Îª-1£¬ÄÇô·þÎñÆ÷ûÓÐÖ´Ðг־û¯²Ù×÷£¬³ÌÐò»áÖ´ÐÐÈý¸ö¼ì²é£º²é¿´ÊÇ·ñÓÐREWRITEAOFÃüÁî±»ÑÓ³ÙÁË£¬ÓоͿªÆôÒ»´ÎеÄREWRITEAOF²Ù×÷£»¼ì²é·þÎñÆ÷µÄ×Ô¶¯±£´æÌõ¼þÊÇ·ñ´ïµ½£¬Èç¹ûÌõ¼þÂú×ã²¢ÇÒûÓÐÆäËûµÄ³Ö¾Ã»¯²Ù×÷£¬ÄÇô·þÎñÆ÷¿ªÆôÒ»´ÎеÄBGSAVE²Ù×÷£»¼ì²é·þÎñÆ÷µÄAOFÖØÐ´Ìõ¼þÊÇ·ñÂú×㣬Èç¹ûÌõ¼þÂú×ã²¢ÔÚ·þÎñÆ÷ûÓÐÆäËû³Ö¾Ã»¯²Ù×÷µÄÇé¿öÏ£¬·þÎñÆ÷¿ªÆôÒ»´ÎеÄREWRITEAOF²Ù×÷¡£

½«AOF»º³åÇøµÄÄÚÈÝдÈëµ½AOFÎļþ£º Èç¹û·þÎñÆ÷¿ªÆôÁËAOF³Ö¾Ã»¯¹¦ÄÜ£¬²¢ÇÒAOF»º³åÇøÓдýдÈëµÄÊý¾Ý£¬ÄÇôserverCronº¯Êý»áµ÷ÓÃÏàÓ¦µÄ³ÌÐò½«AOF»º³åÇøÖеÄÄÚÈÝдÈëµ½AOFÎļþÀïÃæ¡£

¹Ø±ÕÒì²½¿Í»§¶Ë£º ÔÚÕâÒ»²½·þÎñÆ÷»á¹Ø±ÕÄÇЩÊä³ö»º³åÇø´óС³¬¹ýÁËÏÞÖÆµÄ¿Í»§¶Ë¡£

Ôö¼Ócronloops¼ÆÊýÆ÷µÄÖµ£º ´ËÊôÐԼǼÁËserverCronº¯ÊýµÄÖ´ÐдÎÊý¡£Õâ¸öÊôÐÔµÄΨһ×÷ÓþÍÊÇÔÚ¸´ÖÆÄ£¿éÖÐʵÏÖ¡±Ã¿Ö´ÐÐserverCronº¯ÊýN´Î¾ÍÖ´ÐÐÒ»´ÎÖ¸¶¨´úÂ롱µÄ¹¦ÄÜ¡£

3¡¢³õʼ»¯·þÎñÆ÷

Ò»¸öredis·þÎñÆ÷´ÓÆô¶¯µ½Äܹ»½ÓÊÕ¿Í»§¶ËµÄÃüÁîÇëÇó֮ǰ£¬ÐèÒª¾­¹ýһϵÁеijõʼ»¯ºÍÉèÖùý³Ì£¬±ÈÈç³õʼ»¯·þÎñÆ÷״̬£¬½ÓÊÜÓû§Ö¸¶¨µÄ·þÎñÆ÷ÅäÖ㬴´½¨ÏàÓ¦µÄÊý¾Ý½á¹¹ºÍÍøÂçÁ¬½ÓµÈ¡£

³õʼ»¯·þÎñÆ÷״̬½á¹¹£º ³õʼ»¯¹¤×÷ÓÉredis.c/initServerConfigº¯ÊýÍê³É£¬ÉèÖ÷þÎñÆ÷µÄÔËÐÐID¡¢Ä¬ÈÏÔËÐÐÆµÂÊ¡¢Ä¬ÈÏÅäÖÃÎļþ·¾¶¡¢ÔËÐмܹ¹¡¢Ä¬È϶˿ںš¢Ä¬ÈϵÄRDBºÍAOF³Ö¾Ã»¯Ìõ¼þ¡¢³õʼ»¯LRUʱÖÓ¡¢´´½¨ÃüÁî±í¡£

ÔØÈëÅäÖÃÑ¡Ï ¸ù¾ÝÓû§Ö¸¶¨µÄÅäÖÃÑ¡Ïî¶Ôserver״̬½øÐиüС£

³õʼ»¯·þÎñÆ÷Êý¾Ý½á¹¹£º Ç°ÃæµÄinitServerConfigº¯Êý³õʼ»¯server״̬ʱ£¬³ÌÐòÖ»´´½¨ÁËÃüÁî±íÒ»¸öÊý¾Ý½á¹¹£¬·þÎñÆ÷״̬»¹°üÀ¨ÆäËûÊý¾Ý½á¹¹£ºclientsÁ´±í¡¢dbÊý×é¡¢pubsub_channels×ֵ䣨±£´æÆµµÀ¶©ÔÄÐÅÏ¢£©¡¢pubsub_patternsÁ´±í£¨ÓÃÓÚ±£´æÄ£Ê½¶©ÔÄÐÅÏ¢£©¡¢lua£¨ÓÃÓÚÖ´ÐÐlua½Å±¾£©¡¢slowlog£¨±£´æÂý²éѯÈÕÖ¾£©¡£·þÎñÆ÷µ÷ÓÃinitServerº¯ÊýΪÒÔÉÏÊý¾Ý½á¹¹·ÖÅäÄڴ棬²¢ÔÚÓÐÐèÒªµÄʱºòΪÕâЩÊý¾Ý½á¹¹ÉèÖûòÕß¹ØÁª³õʼ»¯Öµ¡£³ýÁ˳õʼ»¯Êý¾Ý½á¹¹Ö®Í⣬initServer»¹½øÐÐһЩ·Ç³£ÖØÒªµÄÉèÖòÙ×÷£ºÎª·þÎñÆ÷ÉèÖýø³ÌÐźŴ¦ÀíÆ÷¡¢´´½¨¹²Ïí¶ÔÏó¡¢´ò¿ª·þÎñÆ÷µÄ¼àÌý¶Ë¿Ú²¢Îª¼àÌýÌ×½Ó×Ö¹ØÁªÁ¬½ÓÓ¦´ðʼþ´¦ÀíÆ÷À´µÈ´ý¿Í»§¶ËµÄÁ¬½ÓÇëÇó¡¢ÎªserverCronº¯Êý´´½¨Ê±¼äʼþÓÃÀ´µÈ´ý·þÎñÆ÷ÕýʽÔËÐÐʱִÐÐserverCronº¯Êý¡¢Èç¹ûAOF³Ö¾Ã»¯¹¦ÄÜÒѾ­´ò¿ªÔò´ò¿ªÏÖÓеÄAOFÎļþ£¨Ã»ÓÐAOFÎļþÔò´´½¨²¢´ò¿ªÒ»¸öеÄAOFÎļþΪдÈëAOF×öºÃ×¼±¸£©¡¢³õʼ»¯·þÎñÆ÷µÄºǫ́I/OÄ£¿é£¨bio£¬Îª½«À´µÄI/O²Ù×÷×öºÃ×¼±¸£©¡£initServerº¯ÊýÖ´ÐÐÍê±ÏÖ®ºó£¬·þÎñÆ÷½«ÓÃASCLL×Ö·ûÔÚÈÕÖ¾ÖдòÓ¡³öredisµÄͼ±ê£¬ÒÔ¼°redisµÄ°æ±¾ºÅÐÅÏ¢¡£

»¹Ô­Êý¾Ý¿â״̬£º Èç¹û·þÎñÆ÷ÆôÓÃÁËAOF³Ö¾Ã»¯¹¦ÄÜ£¬ÄÇô·þÎñÆ÷ʹÓÃAOFÎļþÀ´»¹Ô­Êý¾Ý¿â״̬£»·´Ö®£¬Ê¹ÓÃRDBÎļþÀ´»¹Ô­¡£Êý¾Ý¿â״̬»¹Ô­Ö®ºó£¬·þÎñÆ÷½«ÔÚÈÕÖ¾ÖдòÓ¡³öÔØÈëÎļþ²¢»¹Ô­Êý¾Ý¿â״̬ËùºÄ·ÑµÄʱ³¤¡£

Ö´ÐÐʼþÑ­»·£º ´òÓ¡ÈÕÖ¾£ºthe server is now ready to accept ¡­¡­ È»ºó¿ªÊ¼Ö´ÐзþÎñÆ÷µÄʼþÑ­»·£¨loop£©£¬ÖÁ´Ë£¬·þÎñÆ÷³õʼ»¯¹¤×÷È«²¿Íê³É£¬¿ÉÒÔ½ÓÊܿͻ§¶ËµÄÁ¬½ÓÇëÇó²¢´¦Àí¿Í»§¶Ë·¢À´µÄÃüÁîÇëÇóÁË¡£

   
3836 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ