最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis?Server啟動(dòng)過(guò)程的詳細(xì)步驟

 更新時(shí)間:2022年02月08日 08:33:11   作者:趙海亮的博客  
本文主要介紹了Redis?Server啟動(dòng)過(guò)程的詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文基于社區(qū)版Redis 4.0.8

1、 初始化參數(shù)配置

由函數(shù)initServerConfig()實(shí)現(xiàn),具體操作就是給配置參數(shù)賦初始化值:

//設(shè)置時(shí)區(qū)
setlocale(LC_COLLATE,"");
//設(shè)置隨機(jī)種子
char hashseed[16];
getRandomHexChars(hashseed,sizeof(hashseed));
dictSetHashFunctionSeed((uint8_t*)hashseed);
//初始化module
void initServerConfig(void) {
? ? //serverCron函數(shù)執(zhí)行頻率,默認(rèn)10ms
? ? server.hz = CONFIG_DEFAULT_HZ;
? ? //監(jiān)聽(tīng)端口,默認(rèn)6379
? ? server.port = CONFIG_DEFAULT_SERVER_PORT;
? ? server.tcp_backlog = CONFIG_DEFAULT_TCP_BACKLOG;
? ? server.dbnum = CONFIG_DEFAULT_DBNUM;
? ? ......
? ? //初始化命令表
? ? server.commands = dictCreate(&commandTableDictType,NULL);
? ? server.orig_commands = dictCreate(&commandTableDictType,NULL);
? ? populateCommandTable();
? ? server.delCommand = lookupCommandByCString("del");
? ? server.multiCommand = lookupCommandByCString("multi");
? ? server.lpushCommand = lookupCommandByCString("lpush");
? ? server.lpopCommand = lookupCommandByCString("lpop");
? ? server.rpopCommand = lookupCommandByCString("rpop");
? ? server.sremCommand = lookupCommandByCString("srem");
? ? server.execCommand = lookupCommandByCString("exec");
? ? server.expireCommand = lookupCommandByCString("expire");
? ? server.pexpireCommand = lookupCommandByCString("pexpire");
? ? ......
}

2、 加載并解析配置文件

在這一階段,會(huì)對(duì)命令行傳入的參數(shù)進(jìn)行解析,并且調(diào)用 loadServerConfig 函數(shù),對(duì)命令行參數(shù)和配置文件中的參數(shù)進(jìn)行合并處理,然后為 Redis 各功能模塊的關(guān)鍵參數(shù)設(shè)置合適的取值,以便 server 能高效地運(yùn)行。

//filename表示配置文件全路徑名稱(chēng);
//options表示命令行輸入的配置參數(shù),如port=4000
void loadServerConfig(char *filename, char *options) {
? ? sds config = sdsempty();
? ? char buf[CONFIG_MAX_LINE+1];

? ? /* 加載配置文件到內(nèi)存 */
? ? if (filename) {
? ? ? ? FILE *fp;

? ? ? ? if (filename[0] == '-' && filename[1] == '\0') {
? ? ? ? ? ? fp = stdin;
? ? ? ? } else {
? ? ? ? ? ? if ((fp = fopen(filename,"r")) == NULL) {
? ? ? ? ? ? ? ? serverLog(LL_WARNING,
? ? ? ? ? ? ? ? ? ? "Fatal error, can't open config file '%s'", filename);
? ? ? ? ? ? ? ? exit(1);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? while(fgets(buf,CONFIG_MAX_LINE+1,fp) != NULL)
? ? ? ? ? ? config = sdscat(config,buf);
? ? ? ? if (fp != stdin) fclose(fp);
? ? }
? ? /* Append the additional options */
? ? if (options) {
? ? ? ? config = sdscat(config,"\n");
? ? ? ? config = sdscat(config,options);
? ? }
? ? //解析配置
? ? loadServerConfigFromString(config);
? ? sdsfree(config);
}

3、 初始化服務(wù)器內(nèi)部變量

在完成對(duì)運(yùn)行參數(shù)的解析和設(shè)置后,main 函數(shù)會(huì)調(diào)用 initServer 函數(shù),對(duì) server 運(yùn)行時(shí)的各種資源進(jìn)行初始化工作。包括了 server 資源管理所需的數(shù)據(jù)結(jié)構(gòu)初始化、鍵值對(duì)數(shù)據(jù)庫(kù)初始化、server 網(wǎng)絡(luò)框架初始化等。
最后調(diào)用 loadDataFromDisk 函數(shù),從磁盤(pán)上加載 AOF 或者是 RDB 文件,以便恢復(fù)之前的數(shù)據(jù)。

void initServer(void) {
? ? /* 初始化需要的各種資源 */
? ? server.clients = listCreate();//初始化客戶(hù)端鏈表
? ? server.pid = getpid();
? ? server.current_client = NULL;
? ? server.clients = listCreate();
? ? server.clients_to_close = listCreate();
? ? server.slaves = listCreate();
? ? server.monitors = listCreate();
? ?server.clients_pending_write = listCreate();
? ?server.slaveseldb = -1; /* Force to emit the first SELECT command. */
? ?server.unblocked_clients = listCreate();
? ?server.ready_keys = listCreate();
? ?server.clients_waiting_acks = listCreate();
? ?server.get_ack_from_slaves = 0;
? ?server.clients_paused = 0;
? ?server.system_memory_size = zmalloc_get_memory_size();

? ?createSharedObjects();
? ? //調(diào)用aeCreateEventLoop函數(shù)創(chuàng)建aeEventLoop結(jié)構(gòu)體,并賦值給server結(jié)構(gòu)的el變量
? ? //maxclients 變量的值大小,可以在 Redis 的配置文件 redis.conf 中進(jìn)行定義,默認(rèn)值是 1000
? ? server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR);
? ? if (server.el == NULL) {
? ? ? ? serverLog(LL_WARNING,
? ? ? ? ? ? "Failed creating the event loop. Error message: '%s'",
? ? ? ? ? ? strerror(errno));
? ? ? ? exit(1);
? ? }
? ? ......
? ??
? ? /* 創(chuàng)建數(shù)據(jù)庫(kù)結(jié)構(gòu)*/
? ? for (j = 0; j < server.dbnum; j++) {
? ? ? ? server.db[j].dict = dictCreate(&dbDictType,NULL);
? ? ? ? server.db[j].expires = dictCreate(&keyptrDictType,NULL);
? ? ? ? server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL);
? ? ? ? server.db[j].ready_keys = dictCreate(&objectKeyPointerValueDictType,NULL);
? ? ? ? server.db[j].watched_keys = dictCreate(&keylistDictType,NULL);
? ? ? ? server.db[j].id = j;
? ? ? ? server.db[j].avg_ttl = 0;
? ? }?
? ??
? ? ......
? ? ? ??
? ? //創(chuàng)建事件循環(huán)框架
? ? server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR);
? ? …
? ? //開(kāi)始監(jiān)聽(tīng)設(shè)置的網(wǎng)絡(luò)端口
? ? if (server.port != 0 &&
? ? ? ? ? ? listenToPort(server.port,server.ipfd,&server.ipfd_count) == C_ERR)
? ? ? ? ? ? exit(1);
? ? …
? ? //為server后臺(tái)任務(wù)創(chuàng)建定時(shí)事件
? ? if (aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR) {
? ? ? ? ? ? serverPanic("Can't create event loop timers.");
? ? ? ? ? ? exit(1);
? ? }
? ? …
? ? //為每一個(gè)監(jiān)聽(tīng)的IP設(shè)置連接事件的處理函數(shù)acceptTcpHandler
? ? for (j = 0; j < server.ipfd_count; j++) {
? ? ? ? ? ? if (aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE,
? ? ? ? ? ? ? ? acceptTcpHandler,NULL) == AE_ERR)
? ? ? ? ? ?{ … }
? ? }
}

4、執(zhí)行事件驅(qū)動(dòng)框架

事件驅(qū)動(dòng)框架是 Redis server 運(yùn)行的核心。該框架一旦啟動(dòng)后,就會(huì)一直循環(huán)執(zhí)行,每次循環(huán)會(huì)處理一批觸發(fā)的網(wǎng)絡(luò)讀寫(xiě)事件。main 函數(shù)直接調(diào)用事件框架的主體函數(shù) aeMain(在ae.c文件中)后,就進(jìn)入事件處理循環(huán)了。當(dāng)然,在進(jìn)入事件驅(qū)動(dòng)循環(huán)前,main 函數(shù)會(huì)分別調(diào)用 aeSetBeforeSleepProc 和 aeSetAfterSleepProc 兩個(gè)函數(shù),來(lái)設(shè)置每次進(jìn)入事件循環(huán)前 server 需要執(zhí)行的操作,以及每次事件循環(huán)結(jié)束后 server 需要執(zhí)行的操作。下面代碼顯示了這部分的執(zhí)行邏輯,你可以看下。

aeSetBeforeSleepProc(server.el,beforeSleep);
aeSetAfterSleepProc(server.el,afterSleep);
aeMain(server.el);
aeDeleteEventLoop(server.el);

到此這篇關(guān)于Redis Server啟動(dòng)過(guò)程的詳細(xì)步驟的文章就介紹到這了,更多相關(guān)Redis Server啟動(dòng)過(guò)程 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis中使用redis-dump導(dǎo)出、導(dǎo)入、還原數(shù)據(jù)實(shí)例

    redis中使用redis-dump導(dǎo)出、導(dǎo)入、還原數(shù)據(jù)實(shí)例

    這篇文章主要介紹了redis中使用redis-dump導(dǎo)出、導(dǎo)入、還原數(shù)據(jù)實(shí)例,本文直接給出操作命令,并給出注釋加以說(shuō)明,需要的朋友可以參考下
    2014-11-11
  • Redis 實(shí)現(xiàn)好友關(guān)注和關(guān)注推送的示例代碼

    Redis 實(shí)現(xiàn)好友關(guān)注和關(guān)注推送的示例代碼

    本文介紹了使用Redis實(shí)現(xiàn)好友關(guān)注和關(guān)注推送功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • redis?zset實(shí)現(xiàn)滑動(dòng)窗口限流的代碼

    redis?zset實(shí)現(xiàn)滑動(dòng)窗口限流的代碼

    這篇文章主要介紹了redis?zset實(shí)現(xiàn)滑動(dòng)窗口限流,滑動(dòng)窗口算法思想就是記錄一個(gè)滑動(dòng)的時(shí)間窗口內(nèi)的操作次數(shù),操作次數(shù)超過(guò)閾值則進(jìn)行限流,本文通過(guò)實(shí)例代碼給大家詳細(xì)介紹,需要的朋友參考下吧
    2022-03-03
  • 利用ganglia監(jiān)控redis的最新解決方法

    利用ganglia監(jiān)控redis的最新解決方法

    這篇文章主要給大家介紹了如何利用ganglia監(jiān)控redis的最新解決方法,網(wǎng)上的資料基本上就是13年的一篇文章,但發(fā)現(xiàn)文章的內(nèi)容有些許問(wèn)題,于是整理了下最新的解決方法,下面通過(guò)這篇文章來(lái)一起詳細(xì)的看看吧。
    2016-12-12
  • Redis的持久化方式

    Redis的持久化方式

    Redis提供了兩種主要的持久化方式:RDB和AOF,RDB通過(guò)定時(shí)快照的方式保存數(shù)據(jù)狀態(tài),而AOF記錄每個(gè)寫(xiě)操作以便于重啟時(shí)重放,兩者可以結(jié)合使用,且在重啟時(shí)AOF文件會(huì)被優(yōu)先用于數(shù)據(jù)恢復(fù),RDB快照具有速度快、節(jié)省磁盤(pán)空間的優(yōu)點(diǎn),但可能會(huì)丟失最近的數(shù)據(jù)
    2024-10-10
  • Redis哨兵機(jī)制的使用詳解

    Redis哨兵機(jī)制的使用詳解

    文章講解了Redis哨兵機(jī)制的基本原理、主庫(kù)和從庫(kù)自動(dòng)切換的過(guò)程、如何減少誤判、哨兵集群的組成和通信機(jī)制,以及哨兵在故障發(fā)生時(shí)如何選舉Leader進(jìn)行主從切換
    2025-01-01
  • Spring+Redis+RabbitMQ開(kāi)發(fā)限流和秒殺項(xiàng)目功能

    Spring+Redis+RabbitMQ開(kāi)發(fā)限流和秒殺項(xiàng)目功能

    本項(xiàng)目將通過(guò)整合Springboot和Redis以及Lua腳本來(lái)實(shí)現(xiàn)限流和秒殺的效果,將通過(guò)RabbitMQ消息隊(duì)列來(lái)實(shí)現(xiàn)異步保存秒殺結(jié)果的效果,對(duì)Spring?Redis?RabbitMQ限流秒殺功能實(shí)現(xiàn)感興趣的朋友一起看看吧
    2022-02-02
  • Linux下Redis安裝配置教程

    Linux下Redis安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了Linux下Redis安裝配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 使用Redis實(shí)現(xiàn)UA池的方案

    使用Redis實(shí)現(xiàn)UA池的方案

    這篇文章主要介紹了使用Redis實(shí)現(xiàn)UA池的方案,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Redis連接錯(cuò)誤的情況總結(jié)分析

    Redis連接錯(cuò)誤的情況總結(jié)分析

    這篇文章主要給大家總結(jié)介紹了關(guān)于Redis連接錯(cuò)誤的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02

最新評(píng)論

深州市| 裕民县| 靖西县| 九江市| 金门县| 高邑县| 巴里| 建阳市| 海宁市| 福泉市| 佛教| 阳原县| 台南县| 普兰县| 长宁县| 南和县| 巴青县| 太谷县| 北京市| 明溪县| 宜兰市| 宣汉县| 临高县| 呼图壁县| 长海县| 巴彦淖尔市| 平舆县| 新营市| 微博| 田东县| 宽城| 英山县| 建德市| 鄂托克前旗| 搜索| 衡南县| 鹤庆县| 外汇| 盘山县| 朝阳县| 根河市|