日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入redis内部--初始化服务器

發布時間:2025/4/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入redis内部--初始化服务器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

初始化服務器代碼如下:

void initServer() {int j;signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN);setupSignalHandlers();if (server.syslog_enabled) {openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,server.syslog_facility);}server.current_client = NULL;server.clients = listCreate(); //創建客戶隊列server.clients_to_close = listCreate(); //創建將關閉的客戶隊列server.slaves = listCreate(); //創建從機隊列server.monitors = listCreate(); //創建監控隊列server.slaveseldb = -1; /* Force to emit the first SELECT command. */server.unblocked_clients = listCreate(); //創建非堵塞客戶隊列server.ready_keys = listCreate(); //創建可讀key隊列createSharedObjects(); // 創建共享對象adjustOpenFilesLimit(); //改變可打開文件的最大數量server.el = aeCreateEventLoop(server.maxclients+REDIS_EVENTLOOP_FDSET_INCR); //創建事件處理server.db = zmalloc(sizeof(redisDb)*server.dbnum); //分別db內存/* Open the TCP listening socket for the user commands. */if (listenToPort(server.port,server.ipfd,&server.ipfd_count) == REDIS_ERR) //監聽端口exit(1);/* Open the listening Unix domain socket. */if (server.unixsocket != NULL) {unlink(server.unixsocket); /* don't care if this fails */server.sofd = anetUnixServer(server.neterr,server.unixsocket,server.unixsocketperm);if (server.sofd == ANET_ERR) {redisLog(REDIS_WARNING, "Opening socket: %s", server.neterr);exit(1);}}/* Abort if there are no listening sockets at all. */if (server.ipfd_count == 0 && server.sofd < 0) {redisLog(REDIS_WARNING, "Configured to not listen anywhere, exiting.");exit(1);}/* Create the Redis databases, and initialize other internal state. */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(&setDictType,NULL);server.db[j].watched_keys = dictCreate(&keylistDictType,NULL);server.db[j].id = j;server.db[j].avg_ttl = 0;}server.pubsub_channels = dictCreate(&keylistDictType,NULL);server.pubsub_patterns = listCreate();listSetFreeMethod(server.pubsub_patterns,freePubsubPattern);listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern);server.cronloops = 0;server.rdb_child_pid = -1;server.aof_child_pid = -1;aofRewriteBufferReset();server.aof_buf = sdsempty();server.lastsave = time(NULL); /* At startup we consider the DB saved. */server.lastbgsave_try = 0; /* At startup we never tried to BGSAVE. */server.rdb_save_time_last = -1;server.rdb_save_time_start = -1;server.dirty = 0;server.stat_numcommands = 0;server.stat_numconnections = 0;server.stat_expiredkeys = 0;server.stat_evictedkeys = 0;server.stat_starttime = time(NULL);server.stat_keyspace_misses = 0;server.stat_keyspace_hits = 0;server.stat_peak_memory = 0;server.stat_fork_time = 0;server.stat_rejected_conn = 0;server.stat_sync_full = 0;server.stat_sync_partial_ok = 0;server.stat_sync_partial_err = 0;memset(server.ops_sec_samples,0,sizeof(server.ops_sec_samples));server.ops_sec_idx = 0;server.ops_sec_last_sample_time = mstime();server.ops_sec_last_sample_ops = 0;server.unixtime = time(NULL);server.mstime = mstime();server.lastbgsave_status = REDIS_OK;server.repl_good_slaves_count = 0;/* Create the serverCron() time event, that's our main way to process* background operations. */if(aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR) {redisPanic("Can't create the serverCron time event.");exit(1);}/* Create an event handler for accepting new connections in TCP and Unix* domain sockets. */for (j = 0; j < server.ipfd_count; j++) {if (aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE,acceptTcpHandler,NULL) == AE_ERR){redisPanic("Unrecoverable error creating server.ipfd file event.");}}if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE,acceptUnixHandler,NULL) == AE_ERR) redisPanic("Unrecoverable error creating server.sofd file event.");/* Open the AOF file if needed. */if (server.aof_state == REDIS_AOF_ON) {server.aof_fd = open(server.aof_filename,O_WRONLY|O_APPEND|O_CREAT,0644);if (server.aof_fd == -1) {redisLog(REDIS_WARNING, "Can't open the append-only file: %s",strerror(errno));exit(1);}}/* 32 bit instances are limited to 4GB of address space, so if there is* no explicit limit in the user provided configuration we set a limit* at 3 GB using maxmemory with 'noeviction' policy'. This avoids* useless crashes of the Redis instance for out of memory. */if (server.arch_bits == 32 && server.maxmemory == 0) {redisLog(REDIS_WARNING,"Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.");server.maxmemory = 3072LL*(1024*1024); /* 3 GB */server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION;}replicationScriptCacheInit();scriptingInit();slowlogInit();bioInit(); }

1.1 信號處理

signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN);setupSignalHandlers();

signal語法:

#include <signal.h>void (*signal(int sig, void (*func)(int)))(int); int sighold(int sig); int sigignore(int sig); int sigpause(int sig); int sigrelse(int sig); void (*sigset(int sig, void (*disp)(int)))(int);

signal變量定義在signal.h文件中,其中:

1.信號

Signal

Description

SIGABRT

由調用abort函數產生,進程非正常退出

SIGALRM

用alarm函數設置的timer超時或setitimer函數設置的interval timer超時

SIGBUS

某種特定的硬件異常,通常由內存訪問引起

SIGCANCEL

由Solaris Thread Library內部使用,通常不會使用

SIGCHLD

進程Terminate或Stop的時候,SIGCHLD會發送給它的父進程。缺省情況下該Signal會被忽略

SIGCONT

當被stop的進程恢復運行的時候,自動發送

SIGEMT

和實現相關的硬件異常

SIGFPE

數學相關的異常,如被0除,浮點溢出,等等

SIGFREEZE

Solaris專用,Hiberate或者Suspended時候發送

SIGHUP

發送給具有Terminal的Controlling Process,當terminal被disconnect時候發送

SIGILL

非法指令異常

SIGINFO

BSD signal。由Status Key產生,通常是CTRL+T。發送給所有Foreground Group的進程

SIGINT

由Interrupt Key產生,通常是CTRL+C或者DELETE。發送給所有ForeGround Group的進程

SIGIO

異步IO事件

SIGIOT

實現相關的硬件異常,一般對應SIGABRT

SIGKILL

無法處理和忽略。中止某個進程

SIGLWP

由Solaris Thread Libray內部使用

SIGPIPE

在reader中止之后寫Pipe的時候發送

SIGPOLL

當某個事件發送給Pollable Device的時候發送

SIGPROF

Setitimer指定的Profiling Interval Timer所產生

SIGPWR

和系統相關。和UPS相關。

SIGQUIT

輸入Quit Key的時候(CTRL+/)發送給所有Foreground Group的進程

SIGSEGV

非法內存訪問

SIGSTKFLT

Linux專用,數學協處理器的棧異常

SIGSTOP

中止進程。無法處理和忽略。

SIGSYS

非法系統調用

SIGTERM

請求中止進程,kill命令缺省發送

SIGTHAW

Solaris專用,從Suspend恢復時候發送

SIGTRAP

實現相關的硬件異常。一般是調試異常

SIGTSTP

Suspend Key,一般是Ctrl+Z。發送給所有Foreground Group的進程

SIGTTIN

當Background Group的進程嘗試讀取Terminal的時候發送

SIGTTOU

當Background Group的進程嘗試寫Terminal的時候發送

SIGURG

當out-of-band data接收的時候可能發送

SIGUSR1

用戶自定義signal 1

SIGUSR2

用戶自定義signal 2

SIGVTALRM

setitimer函數設置的Virtual Interval Timer超時的時候

SIGWAITING

Solaris Thread Library內部實現專用

SIGWINCH

當Terminal的窗口大小改變的時候,發送給Foreground Group的所有進程

SIGXCPU

當CPU時間限制超時的時候

SIGXFSZ

進程超過文件大小限制

SIGXRES

Solaris專用,進程超過資源限制的時候發送

================================================================

????? 2.處理函數

SIG_DFL
Request for default signal handling.
SIG_ERR
Return value from signal() in case of error.
SIG_HOLD
Request that signal be held.
???????? SIG_IGN
????? Request that signal be ignored.

????? 3. 建立信號處理函數

void setupSignalHandlers(void) {struct sigaction act;/* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used.* Otherwise, sa_handler is used. */sigemptyset(&act.sa_mask);act.sa_flags = 0;act.sa_handler = sigtermHandler; //信號中斷處理函數,使用?sigaction(SIGTERM, &act, NULL);sigaction(SIGTERM, &act, NULL);#ifdef HAVE_BACKTRACEsigemptyset(&act.sa_mask);act.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;act.sa_sigaction = sigsegvHandler;sigaction(SIGSEGV, &act, NULL);sigaction(SIGBUS, &act, NULL);sigaction(SIGFPE, &act, NULL);sigaction(SIGILL, &act, NULL); #endifreturn; }

1.2 創建共享對象

void createSharedObjects(void) {int j;shared.crlf = createObject(REDIS_STRING,sdsnew("\r\n"));shared.ok = createObject(REDIS_STRING,sdsnew("+OK\r\n"));shared.err = createObject(REDIS_STRING,sdsnew("-ERR\r\n"));shared.emptybulk = createObject(REDIS_STRING,sdsnew("$0\r\n\r\n"));shared.czero = createObject(REDIS_STRING,sdsnew(":0\r\n"));shared.cone = createObject(REDIS_STRING,sdsnew(":1\r\n"));shared.cnegone = createObject(REDIS_STRING,sdsnew(":-1\r\n"));shared.nullbulk = createObject(REDIS_STRING,sdsnew("$-1\r\n"));shared.nullmultibulk = createObject(REDIS_STRING,sdsnew("*-1\r\n"));shared.emptymultibulk = createObject(REDIS_STRING,sdsnew("*0\r\n"));shared.pong = createObject(REDIS_STRING,sdsnew("+PONG\r\n"));shared.queued = createObject(REDIS_STRING,sdsnew("+QUEUED\r\n"));shared.emptyscan = createObject(REDIS_STRING,sdsnew("*2\r\n$1\r\n0\r\n*0\r\n"));shared.wrongtypeerr = createObject(REDIS_STRING,sdsnew("-WRONGTYPE Operation against a key holding the wrong kind of value\r\n"));shared.nokeyerr = createObject(REDIS_STRING,sdsnew("-ERR no such key\r\n"));shared.syntaxerr = createObject(REDIS_STRING,sdsnew("-ERR syntax error\r\n"));shared.sameobjecterr = createObject(REDIS_STRING,sdsnew("-ERR source and destination objects are the same\r\n"));shared.outofrangeerr = createObject(REDIS_STRING,sdsnew("-ERR index out of range\r\n"));shared.noscripterr = createObject(REDIS_STRING,sdsnew("-NOSCRIPT No matching script. Please use EVAL.\r\n"));shared.loadingerr = createObject(REDIS_STRING,sdsnew("-LOADING Redis is loading the dataset in memory\r\n"));shared.slowscripterr = createObject(REDIS_STRING,sdsnew("-BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.\r\n"));shared.masterdownerr = createObject(REDIS_STRING,sdsnew("-MASTERDOWN Link with MASTER is down and slave-serve-stale-data is set to 'no'.\r\n"));shared.bgsaveerr = createObject(REDIS_STRING,sdsnew("-MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.\r\n"));shared.roslaveerr = createObject(REDIS_STRING,sdsnew("-READONLY You can't write against a read only slave.\r\n"));shared.noautherr = createObject(REDIS_STRING,sdsnew("-NOAUTH Authentication required.\r\n"));shared.oomerr = createObject(REDIS_STRING,sdsnew("-OOM command not allowed when used memory > 'maxmemory'.\r\n"));shared.execaborterr = createObject(REDIS_STRING,sdsnew("-EXECABORT Transaction discarded because of previous errors.\r\n"));shared.noreplicaserr = createObject(REDIS_STRING,sdsnew("-NOREPLICAS Not enough good slaves to write.\r\n"));shared.space = createObject(REDIS_STRING,sdsnew(" "));shared.colon = createObject(REDIS_STRING,sdsnew(":"));shared.plus = createObject(REDIS_STRING,sdsnew("+"));for (j = 0; j < REDIS_SHARED_SELECT_CMDS; j++) {char dictid_str[64];int dictid_len;dictid_len = ll2string(dictid_str,sizeof(dictid_str),j);shared.select[j] = createObject(REDIS_STRING,sdscatprintf(sdsempty(),"*2\r\n$6\r\nSELECT\r\n$%d\r\n%s\r\n",dictid_len, dictid_str));}shared.messagebulk = createStringObject("$7\r\nmessage\r\n",13);shared.pmessagebulk = createStringObject("$8\r\npmessage\r\n",14);shared.subscribebulk = createStringObject("$9\r\nsubscribe\r\n",15);shared.unsubscribebulk = createStringObject("$11\r\nunsubscribe\r\n",18);shared.psubscribebulk = createStringObject("$10\r\npsubscribe\r\n",17);shared.punsubscribebulk = createStringObject("$12\r\npunsubscribe\r\n",19);shared.del = createStringObject("DEL",3);shared.rpop = createStringObject("RPOP",4);shared.lpop = createStringObject("LPOP",4);shared.lpush = createStringObject("LPUSH",5);for (j = 0; j < REDIS_SHARED_INTEGERS; j++) {shared.integers[j] = createObject(REDIS_STRING,(void*)(long)j);shared.integers[j]->encoding = REDIS_ENCODING_INT;}for (j = 0; j < REDIS_SHARED_BULKHDR_LEN; j++) {shared.mbulkhdr[j] = createObject(REDIS_STRING,sdscatprintf(sdsempty(),"*%d\r\n",j));shared.bulkhdr[j] = createObject(REDIS_STRING,sdscatprintf(sdsempty(),"$%d\r\n",j));} }

1.3 改變打開的最大文件數量

/* This function will try to raise the max number of open files accordingly to* the configured max number of clients. It will also account for 32 additional* file descriptors as we need a few more for persistence, listening* sockets, log files and so forth.** If it will not be possible to set the limit accordingly to the configured* max number of clients, the function will do the reverse setting* server.maxclients to the value that we can actually handle. */ void adjustOpenFilesLimit(void) {rlim_t maxfiles = server.maxclients+32;struct rlimit limit;if (getrlimit(RLIMIT_NOFILE,&limit) == -1) {redisLog(REDIS_WARNING,"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.",strerror(errno));server.maxclients = 1024-32;} else {rlim_t oldlimit = limit.rlim_cur;/* Set the max number of files if the current limit is not enough* for our needs. */if (oldlimit < maxfiles) {rlim_t f;f = maxfiles;while(f > oldlimit) {limit.rlim_cur = f;limit.rlim_max = f;if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break;f -= 128;}if (f < oldlimit) f = oldlimit;if (f != maxfiles) {server.maxclients = f-32;redisLog(REDIS_WARNING,"Unable to set the max number of files limit to %d (%s), setting the max clients configuration to %d.",(int) maxfiles, strerror(errno), (int) server.maxclients);} else {redisLog(REDIS_NOTICE,"Max number of open files set to %d",(int) maxfiles);}}} }

1.4 創建事件處理

aeEventLoop *aeCreateEventLoop(int setsize) {aeEventLoop *eventLoop;int i;if ((eventLoop = zmalloc(sizeof(*eventLoop))) == NULL) goto err;eventLoop->events = zmalloc(sizeof(aeFileEvent)*setsize);eventLoop->fired = zmalloc(sizeof(aeFiredEvent)*setsize);if (eventLoop->events == NULL || eventLoop->fired == NULL) goto err;eventLoop->setsize = setsize;eventLoop->lastTime = time(NULL);eventLoop->timeEventHead = NULL;eventLoop->timeEventNextId = 0;eventLoop->stop = 0;eventLoop->maxfd = -1;eventLoop->beforesleep = NULL;if (aeApiCreate(eventLoop) == -1) goto err;/* Events with mask == AE_NONE are not set. So let's initialize the* vector with it. */for (i = 0; i < setsize; i++)eventLoop->events[i].mask = AE_NONE;return eventLoop;err:if (eventLoop) {zfree(eventLoop->events);zfree(eventLoop->fired);zfree(eventLoop);}return NULL; }

1.5 綁定監聽端口

/* Initialize a set of file descriptors to listen to the specified 'port'* binding the addresses specified in the Redis server configuration.** The listening file descriptors are stored in the integer array 'fds'* and their number is set in '*count'.** The addresses to bind are specified in the global server.bindaddr array* and their number is server.bindaddr_count. If the server configuration* contains no specific addresses to bind, this function will try to* bind * (all addresses) for both the IPv4 and IPv6 protocols.** On success the function returns REDIS_OK.** On error the function returns REDIS_ERR. For the function to be on* error, at least one of the server.bindaddr addresses was* impossible to bind, or no bind addresses were specified in the server* configuration but the function is not able to bind * for at least* one of the IPv4 or IPv6 protocols. */ int listenToPort(int port, int *fds, int *count) {int j;/* Force binding of 0.0.0.0 if no bind address is specified, always* entering the loop if j == 0. */if (server.bindaddr_count == 0) server.bindaddr[0] = NULL;for (j = 0; j < server.bindaddr_count || j == 0; j++) {if (server.bindaddr[j] == NULL) {/* Bind * for both IPv6 and IPv4, we enter here only if* server.bindaddr_count == 0. */fds[*count] = anetTcp6Server(server.neterr,port,NULL);if (fds[*count] != ANET_ERR) (*count)++;fds[*count] = anetTcpServer(server.neterr,port,NULL);if (fds[*count] != ANET_ERR) (*count)++;/* Exit the loop if we were able to bind * on IPv4 or IPv6,* otherwise fds[*count] will be ANET_ERR and we'll print an* error and return to the caller with an error. */if (*count) break;} else if (strchr(server.bindaddr[j],':')) {/* Bind IPv6 address. */fds[*count] = anetTcp6Server(server.neterr,port,server.bindaddr[j]);} else {/* Bind IPv4 address. */fds[*count] = anetTcpServer(server.neterr,port,server.bindaddr[j]);}if (fds[*count] == ANET_ERR) {redisLog(REDIS_WARNING,"Creating Server TCP listening socket %s:%d: %s",server.bindaddr[j] ? server.bindaddr[j] : "*",server.port, server.neterr);return REDIS_ERR;}(*count)++;}return REDIS_OK; }

1.6 創建redis數據庫,并初始化一些中間狀態

?/* Create the Redis databases, and initialize other internal state. */
??? 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(&setDictType,NULL);
??????? server.db[j].watched_keys = dictCreate(&keylistDictType,NULL);
??????? server.db[j].id = j;
??????? server.db[j].avg_ttl = 0;
??? }
??? server.pubsub_channels = dictCreate(&keylistDictType,NULL);
??? server.pubsub_patterns = listCreate();
??? listSetFreeMethod(server.pubsub_patterns,freePubsubPattern);
??? listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern);
??? server.cronloops = 0;
??? server.rdb_child_pid = -1;
??? server.aof_child_pid = -1;
??? aofRewriteBufferReset();
??? server.aof_buf = sdsempty();
??? server.lastsave = time(NULL); /* At startup we consider the DB saved. */
??? server.lastbgsave_try = 0;??? /* At startup we never tried to BGSAVE. */
??? server.rdb_save_time_last = -1;
??? server.rdb_save_time_start = -1;
??? server.dirty = 0;
??? server.stat_numcommands = 0;
??? server.stat_numconnections = 0;
??? server.stat_expiredkeys = 0;
??? server.stat_evictedkeys = 0;
??? server.stat_starttime = time(NULL);
??? server.stat_keyspace_misses = 0;
??? server.stat_keyspace_hits = 0;
??? server.stat_peak_memory = 0;
??? server.stat_fork_time = 0;
??? server.stat_rejected_conn = 0;
??? server.stat_sync_full = 0;
??? server.stat_sync_partial_ok = 0;
??? server.stat_sync_partial_err = 0;
??? memset(server.ops_sec_samples,0,sizeof(server.ops_sec_samples));
??? server.ops_sec_idx = 0;
??? server.ops_sec_last_sample_time = mstime();
??? server.ops_sec_last_sample_ops = 0;
??? server.unixtime = time(NULL);
??? server.mstime = mstime();
??? server.lastbgsave_status = REDIS_OK;
??? server.repl_good_slaves_count = 0;

?

1.7 創建服務器時間事件

/* Create the serverCron() time event, that's our main way to process* background operations. */if(aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR) {redisPanic("Can't create the serverCron time event.");exit(1);}----------------------------------------------------------------------------- long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds,aeTimeProc *proc, void *clientData,aeEventFinalizerProc *finalizerProc) {long long id = eventLoop->timeEventNextId++;aeTimeEvent *te;te = zmalloc(sizeof(*te));if (te == NULL) return AE_ERR;te->id = id;aeAddMillisecondsToNow(milliseconds,&te->when_sec,&te->when_ms);te->timeProc = proc;te->finalizerProc = finalizerProc;te->clientData = clientData;te->next = eventLoop->timeEventHead;eventLoop->timeEventHead = te;return id; }

補充:servercron

/* This is our timer interrupt, called server.hz times per second.* Here is where we do a number of things that need to be done asynchronously.* For instance:** - Active expired keys collection (it is also performed in a lazy way on* lookup).* - Software watchdog.* - Update some statistic.* - Incremental rehashing of the DBs hash tables.* - Triggering BGSAVE / AOF rewrite, and handling of terminated children.* - Clients timeout of different kinds.* - Replication reconnection.* - Many more...** Everything directly called here will be called server.hz times per second,* so in order to throttle execution of things we want to do less frequently* a macro is used: run_with_period(milliseconds) { .... }*/int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {int j;REDIS_NOTUSED(eventLoop);REDIS_NOTUSED(id);REDIS_NOTUSED(clientData);/* Software watchdog: deliver the SIGALRM that will reach the signal* handler if we don't return here fast enough. */if (server.watchdog_period) watchdogScheduleSignal(server.watchdog_period);/* We take a cached value of the unix time in the global state because* with virtual memory and aging there is to store the current time* in objects at every object access, and accuracy is not needed.* To access a global var is faster than calling time(NULL) */server.unixtime = time(NULL);server.mstime = mstime();run_with_period(100) trackOperationsPerSecond();/* We have just 22 bits per object for LRU information.* So we use an (eventually wrapping) LRU clock with 10 seconds resolution.* 2^22 bits with 10 seconds resolution is more or less 1.5 years.** Note that even if this will wrap after 1.5 years it's not a problem,* everything will still work but just some object will appear younger* to Redis. But for this to happen a given object should never be touched* for 1.5 years.** Note that you can change the resolution altering the* REDIS_LRU_CLOCK_RESOLUTION define.*/updateLRUClock();/* Record the max memory used since the server was started. */if (zmalloc_used_memory() > server.stat_peak_memory)server.stat_peak_memory = zmalloc_used_memory();/* We received a SIGTERM, shutting down here in a safe way, as it is* not ok doing so inside the signal handler. */if (server.shutdown_asap) {if (prepareForShutdown(0) == REDIS_OK) exit(0);redisLog(REDIS_WARNING,"SIGTERM received but errors trying to shut down the server, check the logs for more information");server.shutdown_asap = 0;}/* Show some info about non-empty databases */run_with_period(5000) {for (j = 0; j < server.dbnum; j++) {long long size, used, vkeys;size = dictSlots(server.db[j].dict);used = dictSize(server.db[j].dict);vkeys = dictSize(server.db[j].expires);if (used || vkeys) {redisLog(REDIS_VERBOSE,"DB %d: %lld keys (%lld volatile) in %lld slots HT.",j,used,vkeys,size);/* dictPrintStats(server.dict); */}}}/* Show information about connected clients */if (!server.sentinel_mode) {run_with_period(5000) {redisLog(REDIS_VERBOSE,"%lu clients connected (%lu slaves), %zu bytes in use",listLength(server.clients)-listLength(server.slaves),listLength(server.slaves),zmalloc_used_memory());}}/* We need to do a few operations on clients asynchronously. */clientsCron();/* Handle background operations on Redis databases. */databasesCron();/* Start a scheduled AOF rewrite if this was requested by the user while* a BGSAVE was in progress. */if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 &&server.aof_rewrite_scheduled){rewriteAppendOnlyFileBackground();}/* Check if a background saving or AOF rewrite in progress terminated. */if (server.rdb_child_pid != -1 || server.aof_child_pid != -1) {int statloc;pid_t pid;if ((pid = wait3(&statloc,WNOHANG,NULL)) != 0) {int exitcode = WEXITSTATUS(statloc);int bysignal = 0;if (WIFSIGNALED(statloc)) bysignal = WTERMSIG(statloc);if (pid == server.rdb_child_pid) {backgroundSaveDoneHandler(exitcode,bysignal);} else if (pid == server.aof_child_pid) {backgroundRewriteDoneHandler(exitcode,bysignal);} else {redisLog(REDIS_WARNING,"Warning, detected child with unmatched pid: %ld",(long)pid);}updateDictResizePolicy();}} else {/* If there is not a background saving/rewrite in progress check if* we have to save/rewrite now */for (j = 0; j < server.saveparamslen; j++) {struct saveparam *sp = server.saveparams+j;/* Save if we reached the given amount of changes,* the given amount of seconds, and if the latest bgsave was* successful or if, in case of an error, at least* REDIS_BGSAVE_RETRY_DELAY seconds already elapsed. */if (server.dirty >= sp->changes &&server.unixtime-server.lastsave > sp->seconds &&(server.unixtime-server.lastbgsave_try >REDIS_BGSAVE_RETRY_DELAY ||server.lastbgsave_status == REDIS_OK)){redisLog(REDIS_NOTICE,"%d changes in %d seconds. Saving...",sp->changes, (int)sp->seconds);rdbSaveBackground(server.rdb_filename);break;}}/* Trigger an AOF rewrite if needed */if (server.rdb_child_pid == -1 &&server.aof_child_pid == -1 &&server.aof_rewrite_perc &&server.aof_current_size > server.aof_rewrite_min_size){long long base = server.aof_rewrite_base_size ?server.aof_rewrite_base_size : 1;long long growth = (server.aof_current_size*100/base) - 100;if (growth >= server.aof_rewrite_perc) {redisLog(REDIS_NOTICE,"Starting automatic rewriting of AOF on %lld%% growth",growth);rewriteAppendOnlyFileBackground();}}}/* If we postponed an AOF buffer flush, let's try to do it every time the* cron function is called. */if (server.aof_flush_postponed_start) flushAppendOnlyFile(0);/* Close clients that need to be closed asynchronous */freeClientsInAsyncFreeQueue();/* Replication cron function -- used to reconnect to master and* to detect transfer failures. */run_with_period(1000) replicationCron();/* Run the sentinel timer if we are in sentinel mode. */run_with_period(100) {if (server.sentinel_mode) sentinelTimer();}server.cronloops++;return 1000/server.hz; }

1.8 創建事件處理

??? /* Create an event handler for accepting new connections in TCP and Unix
???? * domain sockets. */
??? for (j = 0; j < server.ipfd_count; j++) {
??????? if (aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE,
??????????? acceptTcpHandler,NULL) == AE_ERR)
??????????? {
??????????????? redisPanic(
??????????????????? "Unrecoverable error creating server.ipfd file event.");
??????????? }
??? }
??? if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE,
??????? acceptUnixHandler,NULL) == AE_ERR) redisPanic("Unrecoverable error creating server.sofd file event.");

1.9 打開aof文件

/* Open the AOF file if needed. */if (server.aof_state == REDIS_AOF_ON) {server.aof_fd = open(server.aof_filename,O_WRONLY|O_APPEND|O_CREAT,0644);if (server.aof_fd == -1) {redisLog(REDIS_WARNING, "Can't open the append-only file: %s",strerror(errno));exit(1);}}

1.10 限制32位機器內存,防止crashed

/* 32 bit instances are limited to 4GB of address space, so if there is* no explicit limit in the user provided configuration we set a limit* at 3 GB using maxmemory with 'noeviction' policy'. This avoids* useless crashes of the Redis instance for out of memory. */if (server.arch_bits == 32 && server.maxmemory == 0) {redisLog(REDIS_WARNING,"Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.");server.maxmemory = 3072LL*(1024*1024); /* 3 GB */server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION;}

1.11 復制初始化

/* ----------------------- REPLICATION SCRIPT CACHE --------------------------* The goal of this code is to keep track of scripts already sent to every* connected slave, in order to be able to replicate EVALSHA as it is without* translating it to EVAL every time it is possible.** We use a capped collection implemented by an hash table for fast lookup* of scripts we can send as EVALSHA, plus a linked list that is used for* eviction of the oldest entry when the max number of items is reached.** We don't care about taking a different cache for every different slave* since to fill the cache again is not very costly, the goal of this code* is to avoid that the same big script is trasmitted a big number of times* per second wasting bandwidth and processor speed, but it is not a problem* if we need to rebuild the cache from scratch from time to time, every used* script will need to be transmitted a single time to reappear in the cache.** This is how the system works:** 1) Every time a new slave connects, we flush the whole script cache.* 2) We only send as EVALSHA what was sent to the master as EVALSHA, without* trying to convert EVAL into EVALSHA specifically for slaves.* 3) Every time we trasmit a script as EVAL to the slaves, we also add the* corresponding SHA1 of the script into the cache as we are sure every* slave knows about the script starting from now.* 4) On SCRIPT FLUSH command, we replicate the command to all the slaves* and at the same time flush the script cache.* 5) When the last slave disconnects, flush the cache.* 6) We handle SCRIPT LOAD as well since that's how scripts are loaded* in the master sometimes.*//* Initialize the script cache, only called at startup. */ void replicationScriptCacheInit(void) {server.repl_scriptcache_size = 10000;server.repl_scriptcache_dict = dictCreate(&replScriptCacheDictType,NULL);server.repl_scriptcache_fifo = listCreate(); }

1.12 初始化lua腳本環境

/* Initialize the scripting environment.* It is possible to call this function to reset the scripting environment* assuming that we call scriptingRelease() before.* See scriptingReset() for more information. */ void scriptingInit(void) {lua_State *lua = lua_open();luaLoadLibraries(lua);luaRemoveUnsupportedFunctions(lua);/* Initialize a dictionary we use to map SHAs to scripts.* This is useful for replication, as we need to replicate EVALSHA* as EVAL, so we need to remember the associated script. */server.lua_scripts = dictCreate(&shaScriptObjectDictType,NULL);/* Register the redis commands table and fields */lua_newtable(lua);/* redis.call */lua_pushstring(lua,"call");lua_pushcfunction(lua,luaRedisCallCommand);lua_settable(lua,-3);/* redis.pcall */lua_pushstring(lua,"pcall");lua_pushcfunction(lua,luaRedisPCallCommand);lua_settable(lua,-3);/* redis.log and log levels. */lua_pushstring(lua,"log");lua_pushcfunction(lua,luaLogCommand);lua_settable(lua,-3);lua_pushstring(lua,"LOG_DEBUG");lua_pushnumber(lua,REDIS_DEBUG);lua_settable(lua,-3);lua_pushstring(lua,"LOG_VERBOSE");lua_pushnumber(lua,REDIS_VERBOSE);lua_settable(lua,-3);lua_pushstring(lua,"LOG_NOTICE");lua_pushnumber(lua,REDIS_NOTICE);lua_settable(lua,-3);lua_pushstring(lua,"LOG_WARNING");lua_pushnumber(lua,REDIS_WARNING);lua_settable(lua,-3);/* redis.sha1hex */lua_pushstring(lua, "sha1hex");lua_pushcfunction(lua, luaRedisSha1hexCommand);lua_settable(lua, -3);/* redis.error_reply and redis.status_reply */lua_pushstring(lua, "error_reply");lua_pushcfunction(lua, luaRedisErrorReplyCommand);lua_settable(lua, -3);lua_pushstring(lua, "status_reply");lua_pushcfunction(lua, luaRedisStatusReplyCommand);lua_settable(lua, -3);/* Finally set the table as 'redis' global var. */lua_setglobal(lua,"redis");/* Replace math.random and math.randomseed with our implementations. */lua_getglobal(lua,"math");lua_pushstring(lua,"random");lua_pushcfunction(lua,redis_math_random);lua_settable(lua,-3);lua_pushstring(lua,"randomseed");lua_pushcfunction(lua,redis_math_randomseed);lua_settable(lua,-3);lua_setglobal(lua,"math");/* Add a helper function that we use to sort the multi bulk output of non* deterministic commands, when containing 'false' elements. */{char *compare_func = "function __redis__compare_helper(a,b)\n"" if a == false then a = '' end\n"" if b == false then b = '' end\n"" return a<b\n""end\n";luaL_loadbuffer(lua,compare_func,strlen(compare_func),"@cmp_func_def");lua_pcall(lua,0,0,0);}/* Add a helper function we use for pcall error reporting.* Note that when the error is in the C function we want to report the* information about the caller, that's what makes sense from the point* of view of the user debugging a script. */{char *errh_func = "function __redis__err__handler(err)\n"" local i = debug.getinfo(2,'nSl')\n"" if i and i.what == 'C' then\n"" i = debug.getinfo(3,'nSl')\n"" end\n"" if i then\n"" return i.source .. ':' .. i.currentline .. ': ' .. err\n"" else\n"" return err\n"" end\n""end\n";luaL_loadbuffer(lua,errh_func,strlen(errh_func),"@err_handler_def");lua_pcall(lua,0,0,0);}/* Create the (non connected) client that we use to execute Redis commands* inside the Lua interpreter.* Note: there is no need to create it again when this function is called* by scriptingReset(). */if (server.lua_client == NULL) {server.lua_client = createClient(-1);server.lua_client->flags |= REDIS_LUA_CLIENT;}/* Lua beginners ofter don't use "local", this is likely to introduce* subtle bugs in their code. To prevent problems we protect accesses* to global variables. */scriptingEnableGlobalsProtection(lua);server.lua = lua; }

1.13 初始化慢日志

/* Initialize the slow log. This function should be called a single time* at server startup. */ void slowlogInit(void) {server.slowlog = listCreate();server.slowlog_entry_id = 0;listSetFreeMethod(server.slowlog,slowlogFreeEntry); }

1.14 初始化bio

/* Initialize the background system, spawning the thread. */ void bioInit(void) {pthread_attr_t attr;pthread_t thread;size_t stacksize;int j;/* Initialization of state vars and objects */for (j = 0; j < REDIS_BIO_NUM_OPS; j++) {pthread_mutex_init(&bio_mutex[j],NULL);pthread_cond_init(&bio_condvar[j],NULL);bio_jobs[j] = listCreate();bio_pending[j] = 0;}/* Set the stack size as by default it may be small in some system */pthread_attr_init(&attr);pthread_attr_getstacksize(&attr,&stacksize);if (!stacksize) stacksize = 1; /* The world is full of Solaris Fixes */while (stacksize < REDIS_THREAD_STACK_SIZE) stacksize *= 2;pthread_attr_setstacksize(&attr, stacksize);/* Ready to spawn our threads. We use the single argument the thread* function accepts in order to pass the job ID the thread is* responsible of. */for (j = 0; j < REDIS_BIO_NUM_OPS; j++) {void *arg = (void*)(unsigned long) j;if (pthread_create(&thread,&attr,bioProcessBackgroundJobs,arg) != 0) {redisLog(REDIS_WARNING,"Fatal: Can't initialize Background Jobs.");exit(1);}bio_threads[j] = thread;} }

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/davidwang456/p/3519929.html

總結

以上是生活随笔為你收集整理的深入redis内部--初始化服务器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

激情视频免费在线观看 | 亚洲视频www | 久久国产高清视频 | 色综合久久66 | 91视频观看免费 | 四虎永久视频 | 日本xxxx.com| 亚洲欧美婷婷六月色综合 | 97av免费视频 | av视屏在线播放 | 久久免费视频精品 | 超碰成人免费电影 | 婷婷伊人五月 | 国产 亚洲 欧美 在线 | 制服丝袜天堂 | 国产高清不卡在线 | 天天色综合三 | 伊人超碰在线 | 伊人国产在线播放 | 人人爱夜夜操 | av综合在线观看 | 999电影免费在线观看2020 | 在线观看视频福利 | 狠狠操天天干 | 欧美日韩在线视频一区二区 | 欧美性超爽 | 精品视频免费观看 | www.久艹| 九九99视频 | 婷五月激情 | 欧美网址在线观看 | 在线影院中文字幕 | 日韩精品一区二区三区不卡 | 91在线91拍拍在线91 | 99色在线视频 | 午夜视频福利 | 欧美午夜a| 久久久免费高清视频 | 国产69精品久久99不卡的观看体验 | 久操视频在线播放 | 91热这里只有精品 | 最新日韩视频在线观看 | 久久久久五月 | 国产日韩精品一区二区在线观看播放 | 狠狠干激情 | 亚洲色图27p | 国产精品短视频 | 日日草天天干 | 激情开心网站 | 人人干狠狠操 | 超碰公开在线观看 | 亚州激情视频 | 久久av不卡| 亚洲欧美日本国产 | 免费毛片一区二区三区久久久 | 日韩特黄一级欧美毛片特黄 | 99久久久国产精品 | 日产中文字幕 | 九九久久久 | 91精品国自产在线 | 亚洲精品视频在线观看网站 | 欧美日韩aaaa | 91黄色小网站 | 91爱在线| 国产亚洲精品久久久久久电影 | 久久久在线免费观看 | 亚洲91视频 | 国产精品欧美久久 | 激情欧美一区二区三区 | 六月色丁 | 久久国产热视频 | 欧美福利精品 | 91福利视频久久久久 | 日韩电影在线观看一区二区 | 中文字幕在线看人 | 久久韩国免费视频 | 黄色在线免费观看网址 | 一级淫片在线观看 | 久久精品5| 天天操一操 | 91精品久久久久久粉嫩 | 高清av免费一区中文字幕 | 国产精品麻豆视频 | 草久在线播放 | 亚洲三级毛片 | 国产精品美女久久久久久久久 | 成人av一区二区三区 | 色偷偷888欧美精品久久久 | 亚洲视频综合 | 丰满少妇麻豆av | 亚洲成人网av | 九九精品视频在线看 | 米奇狠狠狠888 | 超碰在线1| 国产青草视频在线观看 | 91av国产视频 | 免费99| 五月激情婷婷丁香 | 性色av一区二区 | 久艹视频在线观看 | 国产一区二区在线播放 | 久久久精选 | 国产精品欧美一区二区三区不卡 | 偷拍精偷拍精品欧洲亚洲网站 | 成人免费一级 | 337p日本欧洲亚洲大胆裸体艺术 | 五月婷婷一区二区三区 | 国产视频日韩视频欧美视频 | 香蕉97视频观看在线观看 | av成人动漫 | 成人亚洲欧美 | 国产色影院| 成人av高清 | av高清一区 | 成人一级免费视频 | 久久久亚洲网站 | 国产精品成人a免费观看 | 亚洲五月婷婷 | 欧美日韩在线免费观看视频 | 大胆欧美gogo免费视频一二区 | 免费三级av | a电影在线观看 | 麻豆视频成人 | 日日夜夜国产 | 国产精品1区 | 久久手机在线视频 | 黄在线 | 欧美日韩中文在线 | 日韩欧美一区二区三区视频 | 天天天综合网 | 韩国av一区二区三区 | 99久久99久久精品国产片果冰 | 日韩av区 | 日韩色视频在线观看 | 韩日三级在线 | 日韩理论 | 美女久久久久久久久久久 | av成人免费观看 | 奇米网在线观看 | 婷婷丁香五 | 国产成人综合精品 | 波多野结衣最新 | 日韩电影在线观看一区 | 国产一区 在线播放 | 亚洲精品成人免费 | 久要激情网 | 日韩av免费在线电影 | 天天天天天干 | 亚洲欧美视频在线播放 | 婷婷色站| 青青河边草免费视频 | 亚洲综合最新在线 | 五月天色中色 | 麻豆视频国产在线观看 | 亚洲尺码电影av久久 | 亚洲成a人片在线观看网站口工 | 欧美大片在线看免费观看 | 中文不卡视频 | 91精品办公室少妇高潮对白 | 亚洲一区久久 | 成人久久18免费网站图片 | 激情五月播播久久久精品 | 欧美黄在线 | av超碰在线观看 | www日韩在线观看 | 中文字幕第一页av | 日日夜夜天天干 | 欧美国产日韩一区二区三区 | 亚洲视频大全 | 国产精品高潮呻吟久久久久 | 欧美性天天 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 成人免费在线播放视频 | 成年人电影免费在线观看 | 久草电影免费在线观看 | 欧美va天堂在线电影 | 狠狠操狠狠干天天操 | 992tv成人免费看片 | 69久久久久久久 | 日韩av片免费在线观看 | 久久精品一二区 | 日韩视频二区 | 91精品国产综合久久福利不卡 | 精品亚洲va在线va天堂资源站 | 国产一区在线免费观看 | 久久国产露脸精品国产 | 蜜臀久久99精品久久久无需会员 | 综合网av| 99精品视频免费看 | 久久xx视频 | 日韩av图片| 国产精品成人久久 | 国产欧美在线一区 | 日韩视频一| www·22com天天操| 日韩久久精品一区 | 免费看片亚洲 | 国产精品久久久久久久久久三级 | 亚洲人片在线观看 | 免费看一级 | 亚洲激色 | 最近中文字幕久久 | 成人三级av | 国产精品视频久久 | 一区二区三区视频网站 | 国产高清99 | 国产视频精品网 | av黄色影院 | 天堂av高清 | 在线小视频国产 | 日韩电影久久 | 欧美视频日韩视频 | 久热色超碰 | 五月天激情电影 | 成人aaa毛片 | 欧美黄色特级片 | 99久久精品免费看国产 | 粉嫩高清一区二区三区 | www日韩在线观看 | 亚洲h色精品 | 久草视频在线资源站 | 丁香五月亚洲综合在线 | 亚洲国产精品第一区二区 | 国产精品久久电影网 | 91精品免费在线 | 亚洲国产视频在线 | 亚洲国产精品第一区二区 | 免费裸体视频网 | 日韩夜夜爽 | av色图天堂网| 午夜在线免费观看 | 亚洲国产精品久久久 | 91精彩视频 | 六月丁香久久 | 欧美视频日韩 | 黄网站免费大全入口 | 中文av一区二区 | 999热线在线观看 | 久久国内视频 | 狠狠躁日日躁 | 久草在线手机观看 | 中文字幕色综合网 | 日韩三级在线观看 | 玖玖国产精品视频 | 午夜色婷婷 | 久久久这里有精品 | 日韩av中文在线观看 | 米奇四色影视 | 亚洲激精日韩激精欧美精品 | 国产精品第一 | 韩国av电影在线观看 | 国产综合香蕉五月婷在线 | 久久久久久久久久影视 | 日韩精品久久中文字幕 | 亚洲最大av网 | 丁香花中文在线免费观看 | 手机在线看a | 国产日韩精品一区二区三区在线 | 麻豆 videos| 干天天 | 99热官网 | 亚洲专区免费观看 | 久草精品视频在线播放 | 黄色片软件网站 | 亚洲精品国产精品久久99热 | 午夜色站 | 狠狠久久 | 最近中文字幕免费 | 高清免费在线视频 | 久久人人射 | 激情综合网五月激情 | 久久精品视频日本 | 国产三级精品三级在线观看 | 麻豆影视在线观看 | 一区三区视频在线观看 | 久久99深爱久久99精品 | 国内精品一区二区 | 成人av资源网站 | 国产啊v在线观看 | 国产在线日韩 | 日韩在线观看不卡 | 久久久2o19精品 | 国产男男gay做爰 | 欧美精品久久久久久久久久 | 国产成人性色生活片 | 一本一本久久aa综合精品 | 在线观看免费高清视频大全追剧 | 91人网站| 国产原创在线视频 | 国产精品久久久久久久久久久免费 | 亚洲国产99 | 亚洲精品乱码久久久一二三 | 91视视频在线直接观看在线看网页在线看 | 狠狠操狠狠干天天操 | 亚洲视频在线观看 | 韩国av免费在线观看 | 字幕网资源站中文字幕 | 日韩精品视频在线免费观看 | 久久国产精品免费看 | 日韩激情一二三区 | 国产毛片久久久 | 成人91免费视频 | 黄色在线观看www | 久久99国产精品久久99 | 婷婷天天色 | 人人插人人澡 | 欧美aa在线 | 一区二区精品 | 国产打女人屁股调教97 | 日本中文在线观看 | 97理论片 | 欧美亚洲另类在线视频 | 久久影院精品 | 手机成人在线 | 在线观看不卡视频 | 国产永久网站 | 91精品免费 | 黄色成人av在线 | 国产护士hd高朝护士1 | 亚洲黄色片在线 | 九九热国产视频 | 天堂av在线网站 | 十八岁以下禁止观看的1000个网站 | 81国产精品久久久久久久久久 | av看片在线观看 | 伊人手机在线 | 亚洲精品视频在线观看视频 | 三级毛片视频 | 综合激情网 | 在线观看免费一级片 | 视频在线播放国产 | 公与妇乱理三级xxx 在线观看视频在线观看 | 国产一级a毛片视频爆浆 | 中文字幕.av.在线 | 99久久超碰中文字幕伊人 | 在线观看韩日电影免费 | 午夜精品中文字幕 | 久草在线久草在线2 | 五月丁香 | 97国产在线视频 | 精品久久电影 | 九草在线视频 | 欧美色图另类 | av直接看| 久操操| 国产伦理一区二区三区 | 天天综合狠狠精品 | 国产三级国产精品国产专区50 | 四虎最新入口 | 久久综合网色—综合色88 | 国产精品9区 | 在线观看91 | 国产又粗又猛又爽又黄的视频先 | 色欧美成人精品a∨在线观看 | 亚洲精品福利在线 | 日本久久久久久久久 | 日韩欧美在线不卡 | 99国产精品一区二区 | 国产永久免费高清在线观看视频 | 日韩av电影中文字幕 | 天天爱天天射 | 日韩电影一区二区在线观看 | 欧美在线视频一区二区 | 在线观看国产永久免费视频 | 欧美日韩免费在线观看视频 | 久久精品国产亚洲a | 四川bbb搡bbb爽爽视频 | 国产精品久久av | 天天综合狠狠精品 | 日韩精品大片 | 日日爽日日操 | 久久免费一| 日韩视频一区二区在线 | 国产一二三在线视频 | 日韩免费一二三区 | 激情影院在线 | 亚洲精品在线观看免费 | 久久精品a | 天天干天天操天天搞 | 精品自拍av | 天堂网中文在线 | 2019中文| 成人h电影在线观看 | 97成人免费视频 | 黄色软件在线观看视频 | 最近2019中文免费高清视频观看www99 | 欧美另类sm图片 | 国产成人av一区二区三区在线观看 | 亚洲欧洲中文日韩久久av乱码 | 中文字幕一区二区在线播放 | h网站免费在线观看 | 成年人在线观看免费视频 | 国产亚洲精品综合一区91 | 在线日韩精品视频 | 久久亚洲福利视频 | 美女视频黄网站 | av中文字幕日韩 | 日韩激情视频在线 | 亚洲狠狠操 | 亚洲午夜精 | 成人av电影免费观看 | 日韩一区二区三区高清在线观看 | 成人在线视频免费观看 | 国产专区在线 | 久久九九网站 | 国产成人av福利 | 国产黄色成人av | 四虎影视成人永久免费观看视频 | 91在线小视频 | 日韩欧美国产精品 | 精品中文字幕在线观看 | 天天干天天做天天操 | 香蕉久草在线 | 国产精品区二区三区日本 | 日韩视频免费 | 国产a级片免费观看 | 天天综合色天天综合 | 天天操天天射天天爱 | 999成人免费视频 | 久久夜夜爽 | 国产精品精品国产婷婷这里av | 中文字幕影片免费在线观看 | 亚洲精品在线观看视频 | 91香蕉亚洲精品 | 中文区中文字幕免费看 | 丁香激情婷婷 | 99视频一区二区 | 国产精品成人一区二区三区吃奶 | 久久久www免费电影网 | 国产日产高清dvd碟片 | 久久视 | 婷婷精品进入 | 午夜视频在线观看一区二区三区 | 一个色综合网站 | 99久久日韩精品免费热麻豆美女 | av手机在线播放 | 色婷婷88av视频一二三区 | 中文久久精品 | 亚洲精品在线一区二区三区 | 成人在线视频论坛 | 天天做日日做天天爽视频免费 | 超碰免费观看 | 四虎影视精品成人 | 六月丁香激情综合 | 日韩天天操 | 欧美精品乱码久久久久久按摩 | 在线亚洲成人 | 天天操天天干天天综合网 | 99精品视频在线观看 | 国产精品99久久免费黑人 | 国产精品97 | 欧洲一区精品 | 婷婷六月综合网 | 精品国产一区二区三区不卡 | 日韩电影黄色 | 国产午夜麻豆影院在线观看 | av千婊在线免费观看 | 成人av免费在线 | 在线免费观看国产视频 | 人人射人人澡 | 婷婷丁香久久五月婷婷 | 国产 在线 日韩 | 日日摸日日爽 | 97精品电影院 | 最近中文字幕大全中文字幕免费 | 久久久久一区二区三区四区 | 日韩精品一区在线观看 | 欧美九九九 | 日韩高清dvd | 2018精品视频 | 亚洲一区二区三区91 | 色综合小说 | 美女视频久久 | 国产高清av免费在线观看 | 日韩在线网 | 色视频在线免费观看 | 欧美成人视| 国产福利免费在线观看 | 国产亚洲精品久 | 国产精品久久久久久久久蜜臀 | 色诱亚洲精品久久久久久 | 成人午夜在线观看 | 久久精品小视频 | 日韩影视在线观看 | 国产成人精品三级 | 成人在线一区二区三区 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 免费网站看av片 | 最近高清中文在线字幕在线观看 | 欧美一级日韩三级 | 美国人与动物xxxx | 91精品视频在线看 | 久久久性 | 三级av免费| 欧美另类xxx | 欧美日韩国产高清视频 | 久久综合狠狠综合久久综合88 | 欧美韩国日本在线观看 | 久草香蕉在线 | 亚洲精品小视频在线观看 | 亚洲成a人片77777潘金莲 | 中文字幕精品一区二区三区电影 | 午夜三级在线 | 国产色拍拍拍拍在线精品 | 一区二区av| 色欧美视频 | 中文字幕无吗 | 精品免费在线视频 | 欧美日韩中| 久久成人免费电影 | 超碰人人91 | 天天躁日日躁狠狠躁av中文 | 亚洲精品视频一二三 | 二区中文字幕 | 国产免费观看高清完整版 | 91色偷偷| 国产字幕在线播放 | 91精品国产九九九久久久亚洲 | 国产亚洲精品久久久久久 | 国产精品久久久久久久久久免费看 | 免费黄色在线网址 | 国产精品成人免费精品自在线观看 | 免费男女羞羞的视频网站中文字幕 | 99久久精品免费看 | 99999精品视频 | 国产精品一区免费观看 | 久草青青在线观看 | 亚洲最新av网址 | 久久视频在线观看免费 | 国产极品尤物在线 | 在线视频app| 日本视频精品 | 一级性视频 | 五月综合网站 | 免费视频你懂得 | 成人av资源在线 | 国产一区欧美一区 | 久久手机视频 | 日韩com| 91成人免费电影 | www.伊人网 | 中字幕视频在线永久在线观看免费 | 97爱爱爱 | 人人爽人人做 | 日韩xxx视频| 九热精品 | 天天操天天色天天射 | 天天拍天天干 | 久久高清视频免费 | 国产v在线观看 | 又黄又刺激又爽的视频 | 国产精品久久久久久久久大全 | 日日夜日日干 | 性色av免费在线观看 | 在线免费观看麻豆 | 欧美午夜a | 日韩高清片| 国产一区私人高清影院 | 在线观看www.| 玖玖精品视频 | 亚洲精品乱码久久久久久 | 午夜免费在线观看 | 99热这里只有精品在线观看 | 午夜久操 | 久久久伊人网 | 欧美日韩视频在线 | 成人欧美一区二区三区在线观看 | 久久精品麻豆 | 婷婷中文字幕 | 久久精品免视看 | 久久不射影院 | 99视频精品视频高清免费 | 久久中文字幕导航 | 在线之家免费在线观看电影 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 激情综合色综合久久综合 | 99精品视频一区 | 视频一区视频二区在线观看 | 亚洲丝袜一区 | 久久99热这里只有精品 | 色综合久久久久综合 | 91精品久久久久 | 99精品区 | 国产在线中文字幕 | 一区 在线 影院 | 激情xxxx | 久久成人18免费网站 | 欧美精品在线观看 | 国产一区精品在线 | 国语麻豆 | 日韩在线视频在线观看 | 国产成人av片 | 午夜精品99久久免费 | 精品久久久久久国产91 | 成 人 黄 色 视频免费播放 | 国产一区精品在线 | 国产黄大片在线观看 | 在线观看国产麻豆 | 亚洲狠狠婷婷 | 久久综合9988久久爱 | 91麻豆精品国产91久久久无限制版 | 在线免费观看的av网站 | 亚洲四虎在线 | 日韩精品一区在线观看 | 波多野结衣一区二区三区中文字幕 | 欧美日韩二三区 | 激情视频区 | 国产精品入口a级 | 久草在线高清视频 | 91九色视频国产 | 国产69精品久久99的直播节目 | 麻豆91精品| 看黄色.com | 91成品人影院 | 日本久久成人中文字幕电影 | 色中色综合 | 日本成址在线观看 | 午夜国产福利在线观看 | 国产 日韩 欧美 中文 在线播放 | 六月丁香婷婷在线 | 综合在线色 | av在线免费观看黄 | 夜添久久精品亚洲国产精品 | 精品成人免费 | 2019中文 | 国产精品麻豆一区二区三区 | 在线视频a | 国产在线精品福利 | 中文字幕免费播放 | 日韩性xxx| 97超碰国产精品 | 婷婷色资源 | 日本高清中文字幕有码在线 | 国产精品一区二区三区四 | 久久最新 | 91成人精品观看 | 欧美综合色在线图区 | 中文字幕在线观看第三页 | 色婷婷综合在线 | 国产亚洲精品久久久久久电影 | 九九在线视频免费观看 | 在线观看免费高清视频大全追剧 | 69国产精品成人在线播放 | 国产一区免费视频 | 天天色综合久久 | 欧美在线不卡一区 | 黄色精品一区 | 亚洲一区二区黄色 | 丁香激情综合久久伊人久久 | 超碰97国产 | 天无日天天操天天干 | 麻豆91精品91久久久 | 久久久久久久综合色一本 | 国产美女视频免费 | 欧洲激情综合 | 国产色在线观看 | 亚洲欧洲精品视频 | 国产一级淫片免费看 | 久艹在线观看视频 | 国产精品美女久久久久aⅴ 干干夜夜 | a视频在线 | 一级精品视频在线观看宜春院 | 国产黄色在线观看 | 天天射射天天 | av丁香花 | 97视频免费观看2区 亚洲视屏 | wwwwwww黄| 日本精品久久久一区二区三区 | 99精品免费 | 久草在线免费看视频 | 美女福利视频 | 免费麻豆网站 | 91手机视频在线 | 狠狠色狠狠色综合日日小说 | 国产一区二区精品久久91 | 日韩三级免费 | 日韩国产欧美在线视频 | 在线观看香蕉视频 | 激情视频免费在线 | 手机在线观看国产精品 | 一级a性色生活片久久毛片波多野 | 在线观看精品黄av片免费 | 81精品国产乱码久久久久久 | 日韩乱理 | 91亚洲精品久久久蜜桃网站 | 精品免费久久久久久 | 香蕉视频免费在线播放 | 国产 日韩 中文字幕 | 超级碰碰碰视频 | 午夜色婷婷 | 在线播放亚洲激情 | 欧美在线久久 | 香蕉在线观看 | 久久久免费高清视频 | 亚洲干视频在线观看 | a视频在线观看免费 | 在线电影播放 | 日韩午夜电影院 | 亚洲一区二区三区miaa149 | 久久人人爽人人爽人人片av软件 | 久久精品超碰 | 久久精彩视频 | 成人午夜免费剧场 | 91视频高清完整版 | 视频一区亚洲 | 天天天色综合 | 亚洲黄色免费电影 | 永久免费视频国产 | 欧美少妇xxx | 亚洲日本va在线观看 | 国产免费又爽又刺激在线观看 | 中文字幕在线视频网站 | av在线播放免费 | 国产高清在线免费观看 | 97免费在线观看视频 | 精品福利在线视频 | 国产精品1区2区3区 久久免费视频7 | 日本精品一区二区三区在线播放视频 | 最近中文字幕在线 | 天天操天天射天天添 | 操处女逼 | 日韩精品免费一线在线观看 | 免费看的视频 | 久久97久久 | 大胆欧美gogo免费视频一二区 | 亚洲天天 | 欧美在线视频免费 | 国产精品久久99综合免费观看尤物 | 中文字幕在线播放一区 | 最新日韩在线 | 在线观看免费视频 | 91片网 | 久久福利在线 | 日韩国产精品毛片 | 精品一区二三区 | 日韩动漫免费观看高清完整版在线观看 | 久久黄色免费观看 | 国产乱视频 | 手机看片久久 | 国产在线a| 亚洲综合精品视频 | 99这里只有精品视频 | 久久电影国产免费久久电影 | 久久免费电影网 | 美国av片在线观看 | 99久久久成人国产精品 | 国产 一区二区三区 在线 | 人人澡澡人人 | 欧美精品九九99久久 | 一区二区三区四区五区在线视频 | 亚洲精品乱码久久久久久9色 | 四虎永久精品在线 | 中文字幕一区二区三区视频 | 日本在线视频一区二区三区 | 中文字幕日本在线观看 | 国产精品一区二区在线看 | 欧美日韩国内在线 | 久久在线精品视频 | 91精品国产乱码在线观看 | 天天插天天爱 | 黄色国产高清 | 在线观看91 | 婷婷免费视频 | 一本一本久久a久久精品综合 | 亚洲第一中文网 | 国产涩涩在线观看 | 欧美伦理电影一区二区 | 免费看的黄色片 | 亚洲美女在线一区 | 国产手机在线播放 | 色操插| 91精品网站在线观看 | 日韩激情第一页 | 久久高清精品 | 国产精品久久二区 | 亚洲国产精品人久久电影 | 天堂网在线视频 | 亚洲精品美女 | 久久三级毛片 | 国产精品视频免费在线观看 | 久久久久久片 | 911精品美国片911久久久 | 久久综合五月天婷婷伊人 | 国产免费xvideos视频入口 | 一区二区三区电影 | www,黄视频| 国产午夜精品av一区二区 | 午夜手机看片 | 精品免费观看视频 | 不卡的av在线播放 | 胖bbbb搡bbbb擦bbbb | 99热最新精品 | 国产亚洲在线 | 一区二区三区福利 | 最近日本字幕mv免费观看在线 | 国产视频黄 | 91视频首页 | 精品久久久久久久久久国产 | 美女视频黄免费网站 | 亚洲精品高清视频 | 色噜噜狠狠狠狠色综合久不 | 国产精品久久久久亚洲影视 | 国产精品久久久久免费 | 午夜精品av| 欧美日韩综合在线观看 | 深爱激情亚洲 | 精品久久久久久亚洲综合网站 | 国产99精品 | 国产精品99久久久精品 | 欧美激情精品久久久 | 国产一区二区在线免费视频 | 久久精品视频在线看 | 99资源网 | 久久亚洲婷婷 | 国产日产高清dvd碟片 | 亚洲成人av电影 | 久久无码av一区二区三区电影网 | 国产99久久久国产精品成人免费 | 久久免费的视频 | 欧美日韩久 | 99久久精品国产一区二区成人 | 国产一区二区久久 | 成 人 免费 黄 色 视频 | 婷婷资源站 | 亚洲国产中文字幕在线视频综合 | 亚洲精品久久久久www | 久久草草影视免费网 | 成人在线免费小视频 | 黄色三级免费片 | 亚洲欧洲成人精品av97 | 久久天天躁夜夜躁狠狠85麻豆 | 亚洲精品免费观看 | 在线性视频日韩欧美 | 欧美精品一区二区蜜臀亚洲 | 国产一区在线视频播放 | 天天色天天操天天爽 | 美女久久精品 | 毛片随便看 | 91成人久久 | 久久你懂的 | 成人在线播放免费观看 | 狠狠干免费 | 久久精品国产精品 | 日韩亚洲精品电影 | 日韩专区在线 | 五月天色站| 久久久亚洲精华液 | 91爱在线 | 狠狠精品| 久久精品视频日本 | 免费电影一区二区三区 | 婷婷色中文 | 女人魂免费观看 | 久久国产精品成人免费浪潮 | 91免费高清视频 | 日韩成人黄色av | 精品久久久久久亚洲综合网站 | 成人va天堂 | 夜夜夜夜操 | 国产精品久久久久久久久久久久 | 久久久久久久久久久免费视频 | 视频在线99| 亚欧洲精品视频在线观看 | 色偷偷男人的天堂av | 国产专区在线看 | 中文字幕日韩精品有码视频 | 激情久久综合网 | 亚洲激情网站免费观看 | 性色av免费观看 | 国产精品午夜久久 | 99热这里只有精品1 av中文字幕日韩 | 国产精品 亚洲精品 | 欧美午夜精品久久久久久浪潮 | 国产精品久久久久久模特 | 国产精品6999成人免费视频 | 国产成人精品国内自产拍免费看 | 美女视频黄在线 | 精品久久久99 | 日日夜夜人人天天 | 伊人丁香 | 久久视频热 | 欧美极品xxxxx| 久久久国产精品成人免费 | 亚洲成a人片在线观看网站口工 | 国产网红在线观看 | 午夜精品久久久久久 | 亚洲 中文 欧美 日韩vr 在线 | 婷婷丁香色 | 91丨九色丨91啦蝌蚪老版 | 婷婷六月中文字幕 | 成人啊 v | 亚洲国产成人在线 | 91精品国产91热久久久做人人 | 18久久久 | 黄色毛片视频免费 | 精品国产1区 | 91大神在线观看视频 | 日日夜夜精品视频天天综合网 | 香蕉成人在线视频 | 丁香九月激情综合 | 亚洲va在线va天堂 | 国产成人一区二区三区影院在线 | 欧美精品在线免费 | 免费观看全黄做爰大片国产 | 婷婷久久网站 | 在线视频黄 | 叶爱av在线| 成人一区二区三区在线 | 91精品国产91热久久久做人人 | 中文字幕亚洲精品日韩 | www.色在线| 欧美一进一出抽搐大尺度视频 | 日韩精品在线一区 | 免费看黄网站在线 | 日韩视 | 在线观看中文字幕网站 | 在线观看自拍 | 成人动漫一区二区 | 免费欧美高清视频 | 麻豆精品视频在线观看免费 | 亚洲精品一区二区在线观看 | 中文av资源站 | 色综合久久88色综合天天人守婷 | 69国产盗摄一区二区三区五区 | 五月天激情综合网 | 六月色婷婷 | 91九色porny蝌蚪视频 | 国产精品一区二区三区在线 | 美女视频久久久 | 最近中文字幕大全中文字幕免费 | 日b视频在线观看网址 | 99亚洲精品| 五月婷婷欧美视频 | 丁香婷婷色综合亚洲电影 | av丁香| 久久久亚洲电影 | 特级毛片爽www免费版 | 深夜福利视频一区二区 | 免费精品视频在线 | 国产一区二区在线播放视频 | 国产视频二区三区 | 欧美激情片在线观看 | 亚洲第一香蕉视频 | 在线观看免费av网 | 中文字幕观看av | 天堂网av在线 | 免费色视频网址 | 永久免费毛片在线观看 | 国产亚洲精品av | 国产一级免费在线观看 | 欧美一级高清片 | 日日草天天干 | 2023av在线 | 久久久999免费视频 日韩网站在线 | 中文在线中文资源 | 伊人资源站 | 日韩欧美精品在线观看视频 | 国产精品美女久久久久久免费 | 精品国产亚洲一区二区麻豆 | 欧美成人理伦片 | 美女又爽又黄 | 久香蕉| 中文一区在线 | 丁香 久久 综合 | 久久人人爽人人爽人人片av免费 | 亚洲日本va午夜在线影院 | 日韩综合色 | 国产精品女同一区二区三区久久夜 | 99国内精品 | 在线精品视频免费播放 | 精品一二 | 中文字幕在线看视频 | 国产精品岛国久久久久久久久红粉 | 国产精选在线观看 | av成人免费在线 | 中文字幕在线视频第一页 | 色欧美综合 | 国产精品成人久久 | 五月天婷婷免费视频 | 99精品视频在线免费观看 | 99精品在线免费观看 | 国产精品人人做人人爽人人添 | 91麻豆国产 | 国产一区二区精品久久 | 欧美另类亚洲 | 久久女教师 | 国产小视频在线观看 | 不卡精品视频 | av千婊在线免费观看 | 99热这里只有精品久久 | 精品久久久久久国产偷窥 | 色综合在 | 国内综合精品午夜久久资源 | 成人精品一区二区三区中文字幕 | 成人毛片100免费观看 | 欧美在线观看小视频 | 操一草 | 国产手机视频在线观看 |