データベース学習-redisに関するメモ

1926 ワード

redis 2をダウンロードします.4.*バージョンソース
 
A,コマンドの登録
 
struct redisCommand {
    char *name;					//    
    redisCommandProc *proc;		//      
    int arity;					//      
    int flags;					//     REDIS_CMD_DENYOOM,NULL,           ,           
    /* Use a function to determine which keys need to be loaded
     * in the background prior to executing this command. Takes precedence
     * over vm_firstkey and others, ignored when NULL */
    redisVmPreloadProc *vm_preload_proc;
    /* What keys should be loaded in background when calling this command? */
    int vm_firstkey; /* The first argument that's a key (0 = no keys) */
    int vm_lastkey;  /* THe last argument that's a key */
    int vm_keystep;  /* The step between first and last key */
};

 
主に前の4つのパラメータを設定すればよいが、後のいくつかの属性はvmを開いたときのredisプリフェッチオプションの構成について、redis 2.6以降vm特性が廃棄されたため、これらのパラメータが何の役に立つかは見られませんでした.
 
redisCommandProc関数には、パラメータredisClient*cがあります.
c->argvでコマンドのパラメータリストを取得できます
その後、バックグラウンド処理後、addReply関数をクライアント応答メッセージに呼び出す
 
 
B,keepalive特性の構成
 
tcpはkeepalive特性を開いて、redisはanetTcpKeepAlive関数をカプセル化して、しかし有効になっていないで、なぜか分かりません
 
networkでcのcreateClient関数に次のコードを追加し、keepaliveのいくつかのパラメータ値を設定します.
 
 
    anetNonBlock(NULL,fd);
    anetTcpNoDelay(NULL,fd);
    if(server.keepalive){
        anetTcpKeepAlive(NULL,fd);
        setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, (void*)&server.keepidle , sizeof(server.keepidle ));
        setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, (void *)&server.keepinterval , sizeof(server.keepinterval ));
        setsockopt(fd, SOL_TCP, TCP_KEEPCNT, (void *)&server.keepcount , sizeof(server.keepcount ));
    }

 
Redis 2.6.*デフォルトでtcp keepaliveがオンになっています.