Redis 啟動流程分析

來源:互聯網
上載者:User

涉及的組件Redis是基於C語言的,每個C檔案對應一個模組,可以認為是一個組件。根據對其原始碼的分析可以得出,在Redis服務啟動的時候涉及到以下幾個組件模組和方法。

啟動時序圖




在redis.c的main函數,主要做三件事情:

1)載入配置包括從命令列或者傳入設定檔載入;

2)啟動unix和tcp的監聽,用戶端的列表儲存在redisserver的clients中;

3)啟動AE事件。


啟動完成,AE會定時間去查詢各個用戶端是否有輸入,如果有讀取用戶端輸入並且對命令進行解析。

對命令的解析主要是基於redisserver的redisCommandTable (redis.c)進行,從這個結構體可以看出REDIS所有的命令列表以及對應的處理函數。

struct redisCommand redisCommandTable[] = {    {"get",getCommand,2,"r",0,NULL,1,1,1,0,0},    {"set",setCommand,-3,"wm",0,noPreloadGetKeys,1,1,1,0,0},    {"setnx",setnxCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0},    {"setex",setexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0},    {"psetex",psetexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0},    {"append",appendCommand,3,"wm",0,NULL,1,1,1,0,0},    {"strlen",strlenCommand,2,"r",0,NULL,1,1,1,0,0},    {"del",delCommand,-2,"w",0,noPreloadGetKeys,1,-1,1,0,0},    {"exists",existsCommand,2,"r",0,NULL,1,1,1,0,0},    {"setbit",setbitCommand,4,"wm",0,NULL,1,1,1,0,0},    {"getbit",getbitCommand,3,"r",0,NULL,1,1,1,0,0},    {"setrange",setrangeCommand,4,"wm",0,NULL,1,1,1,0,0},    {"getrange",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},    {"substr",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},    {"incr",incrCommand,2,"wm",0,NULL,1,1,1,0,0},    {"decr",decrCommand,2,"wm",0,NULL,1,1,1,0,0},    {"mget",mgetCommand,-2,"r",0,NULL,1,-1,1,0,0},    {"rpush",rpushCommand,-3,"wm",0,NULL,1,1,1,0,0},    {"lpush",lpushCommand,-3,"wm",0,NULL,1,1,1,0,0},    {"rpushx",rpushxCommand,3,"wm",0,NULL,1,1,1,0,0},    {"lpushx",lpushxCommand,3,"wm",0,NULL,1,1,1,0,0},    {"linsert",linsertCommand,5,"wm",0,NULL,1,1,1,0,0},    {"rpop",rpopCommand,2,"w",0,NULL,1,1,1,0,0},    {"lpop",lpopCommand,2,"w",0,NULL,1,1,1,0,0},    {"brpop",brpopCommand,-3,"ws",0,NULL,1,1,1,0,0},    {"brpoplpush",brpoplpushCommand,4,"wms",0,NULL,1,2,1,0,0},    {"blpop",blpopCommand,-3,"ws",0,NULL,1,-2,1,0,0},    {"llen",llenCommand,2,"r",0,NULL,1,1,1,0,0},    {"lindex",lindexCommand,3,"r",0,NULL,1,1,1,0,0},    {"lset",lsetCommand,4,"wm",0,NULL,1,1,1,0,0},    {"lrange",lrangeCommand,4,"r",0,NULL,1,1,1,0,0},    {"ltrim",ltrimCommand,4,"w",0,NULL,1,1,1,0,0},    {"lrem",lremCommand,4,"w",0,NULL,1,1,1,0,0},    {"rpoplpush",rpoplpushCommand,3,"wm",0,NULL,1,2,1,0,0},    {"sadd",saddCommand,-3,"wm",0,NULL,1,1,1,0,0},    {"srem",sremCommand,-3,"w",0,NULL,1,1,1,0,0},    {"smove",smoveCommand,4,"w",0,NULL,1,2,1,0,0},    {"sismember",sismemberCommand,3,"r",0,NULL,1,1,1,0,0},    {"scard",scardCommand,2,"r",0,NULL,1,1,1,0,0},    {"spop",spopCommand,2,"wRs",0,NULL,1,1,1,0,0},    {"srandmember",srandmemberCommand,-2,"rR",0,NULL,1,1,1,0,0},    {"sinter",sinterCommand,-2,"rS",0,NULL,1,-1,1,0,0},    {"sinterstore",sinterstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},    {"sunion",sunionCommand,-2,"rS",0,NULL,1,-1,1,0,0},    {"sunionstore",sunionstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},    {"sdiff",sdiffCommand,-2,"rS",0,NULL,1,-1,1,0,0},    {"sdiffstore",sdiffstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},    {"smembers",sinterCommand,2,"rS",0,NULL,1,1,1,0,0},    {"zadd",zaddCommand,-4,"wm",0,NULL,1,1,1,0,0},    {"zincrby",zincrbyCommand,4,"wm",0,NULL,1,1,1,0,0},    {"zrem",zremCommand,-3,"w",0,NULL,1,1,1,0,0},    {"zremrangebyscore",zremrangebyscoreCommand,4,"w",0,NULL,1,1,1,0,0},    {"zremrangebyrank",zremrangebyrankCommand,4,"w",0,NULL,1,1,1,0,0},    {"zunionstore",zunionstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0},    {"zinterstore",zinterstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0},    {"zrange",zrangeCommand,-4,"r",0,NULL,1,1,1,0,0},    {"zrangebyscore",zrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0},    {"zrevrangebyscore",zrevrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0},    {"zcount",zcountCommand,4,"r",0,NULL,1,1,1,0,0},    {"zrevrange",zrevrangeCommand,-4,"r",0,NULL,1,1,1,0,0},    {"zcard",zcardCommand,2,"r",0,NULL,1,1,1,0,0},    {"zscore",zscoreCommand,3,"r",0,NULL,1,1,1,0,0},    {"zrank",zrankCommand,3,"r",0,NULL,1,1,1,0,0},    {"zrevrank",zrevrankCommand,3,"r",0,NULL,1,1,1,0,0},    {"hset",hsetCommand,4,"wm",0,NULL,1,1,1,0,0},    {"hsetnx",hsetnxCommand,4,"wm",0,NULL,1,1,1,0,0},    {"hget",hgetCommand,3,"r",0,NULL,1,1,1,0,0},    {"hmset",hmsetCommand,-4,"wm",0,NULL,1,1,1,0,0},    {"hmget",hmgetCommand,-3,"r",0,NULL,1,1,1,0,0},    {"hincrby",hincrbyCommand,4,"wm",0,NULL,1,1,1,0,0},    {"hincrbyfloat",hincrbyfloatCommand,4,"wm",0,NULL,1,1,1,0,0},    {"hdel",hdelCommand,-3,"w",0,NULL,1,1,1,0,0},    {"hlen",hlenCommand,2,"r",0,NULL,1,1,1,0,0},    {"hkeys",hkeysCommand,2,"rS",0,NULL,1,1,1,0,0},    {"hvals",hvalsCommand,2,"rS",0,NULL,1,1,1,0,0},    {"hgetall",hgetallCommand,2,"r",0,NULL,1,1,1,0,0},    {"hexists",hexistsCommand,3,"r",0,NULL,1,1,1,0,0},    {"incrby",incrbyCommand,3,"wm",0,NULL,1,1,1,0,0},    {"decrby",decrbyCommand,3,"wm",0,NULL,1,1,1,0,0},    {"incrbyfloat",incrbyfloatCommand,3,"wm",0,NULL,1,1,1,0,0},    {"getset",getsetCommand,3,"wm",0,NULL,1,1,1,0,0},    {"mset",msetCommand,-3,"wm",0,NULL,1,-1,2,0,0},    {"msetnx",msetnxCommand,-3,"wm",0,NULL,1,-1,2,0,0},    {"randomkey",randomkeyCommand,1,"rR",0,NULL,0,0,0,0,0},    {"select",selectCommand,2,"rl",0,NULL,0,0,0,0,0},    {"move",moveCommand,3,"w",0,NULL,1,1,1,0,0},    {"rename",renameCommand,3,"w",0,renameGetKeys,1,2,1,0,0},    {"renamenx",renamenxCommand,3,"w",0,renameGetKeys,1,2,1,0,0},    {"expire",expireCommand,3,"w",0,NULL,1,1,1,0,0},    {"expireat",expireatCommand,3,"w",0,NULL,1,1,1,0,0},    {"pexpire",pexpireCommand,3,"w",0,NULL,1,1,1,0,0},    {"pexpireat",pexpireatCommand,3,"w",0,NULL,1,1,1,0,0},    {"keys",keysCommand,2,"rS",0,NULL,0,0,0,0,0},    {"dbsize",dbsizeCommand,1,"r",0,NULL,0,0,0,0,0},    {"auth",authCommand,2,"rsl",0,NULL,0,0,0,0,0},    {"ping",pingCommand,1,"r",0,NULL,0,0,0,0,0},    {"echo",echoCommand,2,"r",0,NULL,0,0,0,0,0},    {"save",saveCommand,1,"ars",0,NULL,0,0,0,0,0},    {"bgsave",bgsaveCommand,1,"ar",0,NULL,0,0,0,0,0},    {"bgrewriteaof",bgrewriteaofCommand,1,"ar",0,NULL,0,0,0,0,0},    {"shutdown",shutdownCommand,-1,"ar",0,NULL,0,0,0,0,0},    {"lastsave",lastsaveCommand,1,"rR",0,NULL,0,0,0,0,0},    {"type",typeCommand,2,"r",0,NULL,1,1,1,0,0},    {"multi",multiCommand,1,"rs",0,NULL,0,0,0,0,0},    {"exec",execCommand,1,"sM",0,NULL,0,0,0,0,0},    {"discard",discardCommand,1,"rs",0,NULL,0,0,0,0,0},    {"sync",syncCommand,1,"ars",0,NULL,0,0,0,0,0},    {"replconf",replconfCommand,-1,"ars",0,NULL,0,0,0,0,0},    {"flushdb",flushdbCommand,1,"w",0,NULL,0,0,0,0,0},    {"flushall",flushallCommand,1,"w",0,NULL,0,0,0,0,0},    {"sort",sortCommand,-2,"wm",0,NULL,1,1,1,0,0},    {"info",infoCommand,-1,"rlt",0,NULL,0,0,0,0,0},    {"monitor",monitorCommand,1,"ars",0,NULL,0,0,0,0,0},    {"ttl",ttlCommand,2,"r",0,NULL,1,1,1,0,0},    {"pttl",pttlCommand,2,"r",0,NULL,1,1,1,0,0},    {"persist",persistCommand,2,"w",0,NULL,1,1,1,0,0},    {"slaveof",slaveofCommand,3,"ast",0,NULL,0,0,0,0,0},    {"debug",debugCommand,-2,"as",0,NULL,0,0,0,0,0},    {"config",configCommand,-2,"ar",0,NULL,0,0,0,0,0},    {"subscribe",subscribeCommand,-2,"rpslt",0,NULL,0,0,0,0,0},    {"unsubscribe",unsubscribeCommand,-1,"rpslt",0,NULL,0,0,0,0,0},    {"psubscribe",psubscribeCommand,-2,"rpslt",0,NULL,0,0,0,0,0},    {"punsubscribe",punsubscribeCommand,-1,"rpslt",0,NULL,0,0,0,0,0},    {"publish",publishCommand,3,"pfltr",0,NULL,0,0,0,0,0},    {"watch",watchCommand,-2,"rs",0,noPreloadGetKeys,1,-1,1,0,0},    {"unwatch",unwatchCommand,1,"rs",0,NULL,0,0,0,0,0},    {"restore",restoreCommand,4,"awm",0,NULL,1,1,1,0,0},    {"migrate",migrateCommand,6,"aw",0,NULL,0,0,0,0,0},    {"dump",dumpCommand,2,"ar",0,NULL,1,1,1,0,0},    {"object",objectCommand,-2,"r",0,NULL,2,2,2,0,0},    {"client",clientCommand,-2,"ar",0,NULL,0,0,0,0,0},    {"eval",evalCommand,-3,"s",0,zunionInterGetKeys,0,0,0,0,0},    {"evalsha",evalShaCommand,-3,"s",0,zunionInterGetKeys,0,0,0,0,0},    {"slowlog",slowlogCommand,-2,"r",0,NULL,0,0,0,0,0},    {"script",scriptCommand,-2,"ras",0,NULL,0,0,0,0,0},    {"time",timeCommand,1,"rR",0,NULL,0,0,0,0,0},    {"bitop",bitopCommand,-4,"wm",0,NULL,2,-1,1,0,0},    {"bitcount",bitcountCommand,-2,"r",0,NULL,1,1,1,0,0}};



相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.