±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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£©£¬ÖÁ´Ë£¬·þÎñÆ÷³õʼ»¯¹¤×÷È«²¿Íê³É£¬¿ÉÒÔ½ÓÊܿͻ§¶ËµÄÁ¬½ÓÇëÇó²¢´¦Àí¿Í»§¶Ë·¢À´µÄÃüÁîÇëÇóÁË¡£ |